1. 程式人生 > >Swift——Any和 AnyObject區別

Swift——Any和 AnyObject區別

AnyObject 可以代表任何class型別的例項 Any 可以表示任意型別,甚至包括方法(func)型別 一、AnyObject 。 寫過Objective-C的朋友會知道在Objective-C中有一個叫做id的型別。編譯器不會對向宣告的為id的變數進行型別檢查,它可以表示任意類的例項。在Cocoa框架中不很多地方都使用了id來進行像引數傳遞和方法返回這樣的工作,這是Objective-C動態特性的一種表現。現在的Swift最主要的用途依然是使用Cocoa框架進行app開發,因此為了與Cocoa架構協作,將原來id的概念使用了一個類似的,可以代表任意class 型別的AnyObject來進行替代。
id與AnyObject有本質的區別。在Swift中編譯器不僅不會對Anyobject例項的方法呼叫做出檢查,甚至對於AnyObject 的所有方法呼叫都會返回Optional 的結果。這雖然是符合Anyobject中的理念,但是在Swift環境下使用起來就非常麻煩,也很危險。應該選擇的做法是在使用時先確定Anyobject真正的型別並進行轉換以後再進行呼叫。 AnyObject的定義,可以發現它其它就是一個介面: 特別之處在於,所有的class都隱式地實現了這個介面,這也是AnyObject 只適用於class型別 的原因。 二、Any Swift中所有的基本型別,包括Array 和Dictionary 這些傳統意義上會是class的東西,統統都是struct型別,並不能由AnyObject來表示 ,於是Apple提出一個更為特殊的Any。除了class 以外,它還可以包括struct 和enum在內的所有型別。
總結: AnyObject 可以代表任何class型別的例項 any :表示資料型別