Swift4语法极简手册 — Type Casting

Swift4语法极简手册

第十九章节:Type Casting

Type Casting

Swift中的类型转换包括is以及as两个

  • is是判断一个实例是否属于某个Class,Struct,Enum或protocol等
  • as是将实例转换成相应的Class,Struct,Enum或Protocol等

IS

以下情况下is都是true

  • 实例属于某个Class,Struct或Enum
  • 实例属于某个Class的子类,子子类等
  • 实例实现了某个Protocol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
}
class B : A{
}
class C {
}
let b = B()
//true B 是 A的子类
let isA = b is A
//true b就是B的实例
let isB = b is B
//false
let isC = b is C

AS

as是用来将实例转换成你期望的Class,Struct,Enum或Protocol等

as?

尝试转换,失败为nil,成功为**Optional(你要转换的)

as!

强制转换,失败报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A {
}
class B : A{
}
class C {
}
let b = B()
//A
let c = b as! A
//Optional
let d = b as? A
//nil
let e = b as? C
//runtime error
let d = b as! C

Any & AnyObject

Swift中,有两个特殊的类和实例,一个是Any,一个是AnyObject

Any表示任意Class,Struct,Enum,Protocol或function等

AnyObject表示任意实例

这两个有什么用

  • 可以用在一些数组等集合中,让你在数组中允许不同类型的对象
  • 与OC对象混用的时候
1
2
3
4
5
6
7
8
9
10
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things.append({ (name: String) -> String in "Hello, \(name)" })