2016-02-15 50 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

相关问题