2016-02-15 52 views
2

考慮代碼:爲什麼Swift Array <Int>與AnyObject兼容?

struct S { 
    var f : Int64 = 0 
} 

... 

let coder : NSCoder = someCoder ... 
let a : [Int] = [] 
coder.encodeObject(a) // compiles 
let b : [Int64] = [] 
coder.encodeObject(b) // doesn't compile: not AnyObject 
let s : [S] = [] 
coder.encodeObject(s) // doesn't compile: not AnyObject 

注意Int被定義爲struct

所以[Int]是對象,但[Int64]不是,也不是我的簡單結構數組。

Int的特別之處是什麼?

回答

5

如果導入Foundation(你一定要,因爲你參考NSCoder),然後[Int]被隱式橋接到NSArray因爲Int被隱式橋接到NSNumberInt64和您的非objc結構不會隱式橋接到ObjC類型,因此這些數組的數組不會被橋接到NSArray

+0

只是爲了保持完整性,還有什麼其他種類型,其中在陣列中使用時,都將通過橋的NSArray? – rghome

+0

符合'_ObjectiveCBridgeable'的任何內容。點擊'Foundation'進入'Foundation'界面,然後搜索'_ObjectiveCBridgeable'。 –

+0

有關文檔,請參閱https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-ID61。 –

3

Int is 橋接(正如UInt和Float和Double以及Bool)。這意味着當你投射到AnyObject時,它們會自動包含在你的NSNumber中,反之亦然。

其他數字類型,唉,不是。

反過來,你也可以利用陣列鑄造的語法糖。一個NSArray必須由Objective-C對象組成,比如NSNumber。當你開始使用Swift數組時,你不必將元素自己封裝在NSNumber中,就像使用Int64數組一樣,當你將Swift數組強制轉換爲NSArray時,它們會被封裝起來。

+0

有關橋接的類型的更多詳細信息,請參閱我書中的附錄:http://www.apeth.com/swiftBook/apa.html#_objective_c_objects_and_swift_objects – matt

+0

好的 - 謝謝。你回答了對另一個問題的評論。 – rghome

1

如果Foundation框架是進口的,Int(不像Int64)被隱式橋接到NSNumber這符合AnyObject

相關問題