考虑代码:
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
有什么特别之处?
答案 0 :(得分:5)
如果您导入Foundation
(因为您引用了NSCoder
,必须这样),[Int]
会隐式桥接到NSArray
,因为Int
是隐式桥接的到NSNumber
。 Int64
并且您的非objc结构不会隐式桥接到ObjC类型,因此这些结构的数组不会桥接到NSArray
。
答案 1 :(得分:3)
Int 桥接(与UInt,Float和Double以及Bool一样)。这意味着当你转换为AnyObject时,它们会自动包含在NSNumber中,反之亦然。
其他数字类型,唉,不是。
反过来,你也可以利用阵列转换语法糖。 NSArray必须由Objective-C对象组成,例如NSNumber。当你开始使用Swift数组时,不必像在Int64数组中那样自己将元素包装在NSNumber中,而是在将Swift数组转换/桥接到NSArray时为它们包装。
答案 2 :(得分:1)
如果导入Foundation
框架,Int
(与Int64
不同)会隐式桥接到符合NSNumber
的{{1}}