iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
Mobile Development

30 天從 Swift 學會 Objective-C系列 第 14

[14] 30 天從 Swift 學會 Objective-C:Objective-C 物件的多型

  • 分享至 

  • xImage
  •  

多型包含了型別的共用、函式的共用、概念的共用。

Photo by @mimithian on Unsplash

Swift 的多型

我們知道 Swift 的多型可以透過型別抹除來使用多型:

// Swift

class A {}
class B: A{}

let o:A = B()

Objective-C 編譯期沒有辦法阻擋型別錯誤

在 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。然而編譯警告並不是說出現就出現的。

Objective-C id 與 instancetype

在 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,相信會有很不錯的收穫。

簡單測驗

  1. 如果你要跟程式新手解釋多型,你會如何解釋。

上一篇
[13] 30 天從 Swift 學會 Objective-C:Objective-C 物件的繼承 Inheritance, Protocol
下一篇
[15] 30 天從 Swift 學會 Objective-C:Objective-C 物件的泛型 Generic
系列文
30 天從 Swift 學會 Objective-C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言