AnyObject
-
AnyObject是個什么玩意呢? 有什么用呢?
我們點進其頭文件看一下, 發(fā)現(xiàn)
@objc public protocol AnyObject { }
, 這個單詞protocol
大家都認識吧, 對AnyObject
是一個協(xié)議, 它的注釋第一行有這么一句話:The protocol to which all classes implicitly conform.
意思是所有的類都隱式遵守了這個協(xié)議.AnyObject有什么用呢?有過Objective-C開發(fā)經(jīng)驗的人肯定知道
id
, 它可以表示任意類的實例, 編譯器不會對向聲明為 id 的變量進行類型檢查.而 Swift為了與 Cocoa 架構(gòu)進行協(xié)作開發(fā)控嗜,就將原來的id用 AnyObject 來進行替代。
-
AnyObject的自動類型轉(zhuǎn)換
- Objective-C的NSArray里面只能保存對象類型, 不能添加基本數(shù)據(jù)類型, 枚舉,結(jié)構(gòu)體等.但是如果我們在Swfit里面將Array的元素類型聲明成
AnyObject
會發(fā)生什么呢? 我們定義一個數(shù)組:let array:[Any] = ["123", 123]
, 在其下面插入一個斷點, 如下圖所示
- Objective-C的NSArray里面只能保存對象類型, 不能添加基本數(shù)據(jù)類型, 枚舉,結(jié)構(gòu)體等.但是如果我們在Swfit里面將Array的元素類型聲明成
沒錯, 它將基本數(shù)據(jù)類型`int`轉(zhuǎn)換成了Objective-C中的`NSNumber`對象,
所以在Swift中, 我們將基本數(shù)據(jù)類型或者enum和struct通過AnyObject來保存也不會像Objective-C那樣報錯, 因為Swift中很多數(shù)據(jù)類型可以和Objective-C中的數(shù)據(jù)類型進行自動轉(zhuǎn)換
Any
-
Any
是什么? 同上, 我們進入Any
所在的頭文件:public typealias Any = protocol<>
, 關于type alias
, 大家可以進入喵神的<a >TYPEALIAS 和泛型接口</a>這篇文章進行詳細了解. 我們直接看Any
的注釋:/// The protocol to which all types implicitly conform.
, (小tip:///
在Swift中就是文檔注釋), 意思是所有的類型, 都隱式的遵守這個協(xié)議. - 說得更直白一點, 就是所有的類型都可以用
Any
表示, 包括基本數(shù)據(jù)類型, enum, struct, func(方法)等等. - 此時, 我們和
AnyObject
, 我們也定義一個數(shù)組, 用Any類型保存:let array: [Any] = ["123", 123]
, 同樣插入一個斷點, 如圖:
顯而易見, `Any `并不會如同`AnyObject `一樣進行數(shù)據(jù)類型的轉(zhuǎn)換
AnyClass
AnyClass
: 表示任意類的元類型.它所在的頭文件這樣寫道:public typealias AnyClass = AnyObject.Type
, 它的注釋第一句就指明了:/// The protocol to which all class types implicitly conform.
, 任意類的類型都隱式遵守這個協(xié)議.AnyObject.Type
中的.Type
就是獲取元類型, 辟如你有一個Student
類,Student.Type
就是獲取Student
的元類型.如果一個變量/常量的類型是
AnyClass
,AnyClass
并不知道其具體的類型, 所以需要將他轉(zhuǎn)換為已知的類型, 然后再調(diào)用init()方法創(chuàng)建對象關于
AnyClass
可以參考我的另一篇文章<a href="http://www.reibang.com/p/f2503afff164">Swift:獲取命名空間(namespace),動態(tài)加載類</a>
聯(lián)系我
<a >github</a>
<a >微博</a>
<a href="http://www.reibang.com/users/9723687edfb5/latest_articles">簡書</a>