over 1 year 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()
← iOS Swift : Error Handling iOS Swift : Extensions →