about 6 years ago
Type Casting
用以檢查 instance 屬於哪種型別或是轉成指定型別。
is & as
用 is 來確認型別,只會回傳 true or false。
subclass 可以被確認成其 superclass 的型別,
但 superclass 無法被確認其 superclass 的型別。
class MyClass {
}
class MyClass2: MyClass {
var c2 = 123
}
class MyClass3: MyClass {
var c3 = 456
}
let array = [MyClass2(), MyClass3()]
for v in array {
if v is MyClass2 {
print("MyClass2")
}
else if v is MyClass3 {
print("MyClass3")
}
}
用 as 可以將 instance 來轉型至指定型別,回傳 optionals,
因此可以使用 as? 或是 as! 來處理。
subclass 可以被轉成成其 superclass 的型別,
但 superclass 無法被轉成其 superclass 的型別。
class MyClass {
}
class MyClass2: MyClass {
var c2 = 123
}
class MyClass3: MyClass {
var c3 = 456
}
let array = [MyClass2(), MyClass3()]
for v in array {
if let c = v as? MyClass2 {
print(c.c2)
}
else let c = v as? MyClass3 {
print(c.c3)
}
}
Any & AnyObject
Any 可表示 instance 的任何型別包含 function 型別,AnyObject 只能表示任何 class 的型別。
class MyClass {
}
func myFunc() -> Int {
retur 0
}
var array1 = [Any]()
array1.append(MyClass())
array1.append(myFunc)
var array2 = [AnyObject]()
array2.append(MyClass())
配合 switch case
class MyClass {
}
func myFunc() -> Int {
retur 0
}
var array = [Any]()
array1.append(MyClass())
array1.append(myFunc)
for v in array
{
switch v {
case is Int:
print("Int")
case let c as MyClass:
print("MyClass")
case let f as () -> Int:
print("Func")
default:
print("??")
}
}
Nested Types
Enumerations, classes 與 structure 都屬於巢狀類型。
class MyClass {
struct MyStruct {
class MyClass2 {
enum MyEnum {
struct MyStruct2 {
}
}
}
}
}
引用方法
let c = MyClass.MyStruct.MyClass2.MyEnum.MyStruct2()