多型包含了型別的共用、函式的共用、概念的共用。
Photo by @mimithian on Unsplash
我們知道 Swift 的多型可以透過型別抹除來使用多型:
// Swift
class A {}
class B: A{}
let o:A = B()
在 Objective-C 由於是訊息傳遞的關係,而所有型別與指令只要在 header 出現就可以使用,也就是說下面的程式碼只要 pointer 對齊,就可以編譯與執行,但是會顯示警告。
NSArray* a = @1; // 1
NSLog(@"%@",a);
Incompatible pointer types initializing 'NSArray *' with an expression of type 'NSNumber *'
因為這樣的關係,程式都應該注意所有警告。
因此,Swift 的型別抹除基本上在 Objective-C 是沒有什麼用處的,唯一的用處是可以參考編譯警告 Incompatible pointer
。然而編譯警告並不是說出現就出現的。
在 Swift 有所謂 AnyObject,其對應 Objective-C 的是 id,我們可以使用 id 作為 參數與回傳型別。
// Objective-C
- (id) getSomething:(id) form;
然而由於是任意型別的關係,編譯器並沒有辦法透過語法知道對應的資料。而 instancetype 則可以讓編譯器有足夠的資訊推斷後續的指令是不是合法的。這部分請參考 Would it be beneficial to begin using instancetype instead of id? - StackOverflow
推薦 wwdc 2013: 404 Advances in Objective-C,相信會有很不錯的收穫。