为什么Swift Array <int>与AnyObject兼容?

时间:2016-02-15 19:23:58

标签: arrays swift object

考虑代码:

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有什么特别之处?

3 个答案:

答案 0 :(得分:5)

如果您导入Foundation(因为您引用了NSCoder,必须这样),[Int]会隐式桥接到NSArray,因为Int是隐式桥接的到NSNumberInt64并且您的非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}}