为什么我可以拥有[AnyObject]
数组并在其中放入一堆不同大小的类型......
var a = [AnyObject]()
a.append(Int(1))
a.append(Float64(3.14))
a.append(Bool(true))
... Int32
和Int64
....
a.append(Int32(1)) // err: type 'Int32' does not conform to protocol 'AnyObject'
a.append(Int64(1)) // err: type 'Int64' does not conform to protocol 'AnyObject'
AnyObject
的文档说:
“AnyObject可以表示任何类类型的实例”
但是,当我按住Int
,Int32
或Int64
命令查看这些类型的标准库定义时,我发现它们都是struct
个值。
这里的根本问题是什么?为什么这样设计?
答案 0 :(得分:24)
Swift中有两种类型 - Any
,它可以真正拥有任何东西 - 结构,枚举或类,以及AnyObject
,它们只能容纳类。
似乎AnyObject
似乎可以保留结构的原因是某些特定类型会根据需要隐式转换为它们的NSEquivalent,以使Objective-C interop减少痛苦。
当您撰写let ao: AnyObject = Int(1)
时,确实将Int
放入AnyObject
。相反,它隐含地将您的Int
转换为NSNumber
,这是一个类,然后将其放入。
但只有一些类型具有此隐式转换。 Int
确实如此,但Int32
没有,因此这种行为:
// fine
let aoInt: AnyObject = Int(1) as NSNumber
// also fine: implicit conversion
let aoImplicitInt: AnyObject = Int(1)
// not fine: error: 'Int32' is not convertible to 'NSNumber'
let aoInt32: AnyObject = Int32(1) as NSNumber
// but the implicit error is less, ahem, explicit
// error: type 'Int32' does not conform to protocol 'AnyObject'
let aoImplicitInt32: AnyObject = Int32(1)
可能有人认为应该有更多隐含的转换来润滑车轮,但话说再次,这些隐含的转换已经引起了很多混乱,最新beta的方向是减少它们而不是更多。< / p>
答案 1 :(得分:0)
赋予Int等人这种能力的协议是_ObjectiveCBridgeable,you can adopt yourself如果你有冒险精神。
答案 2 :(得分:0)
因为Int是值Type。
AnyObject 是指依据类型(类)而不是值类型
任何指的是依据类型 + 值类型(结构+类)
您必须对ValueTypes使用Any,而不是AnyObject
价值类型&gt;通常结构,枚举,bla bla ..
参与类型&gt;通常是班级
有两种类型的变量&gt;参考类型和价值类型
参考类型是指针类型,通常包含存储原始数据的ram地址值
值类型不是地址。它们直接包含变量值
Int asd = 3(asd直接包含3)
Int,Float,数字类型,......在大多数计算机语言中,日期几乎总是struct(值类型)。
在大多数计算机语言中,字符串几乎总是混合使用
ViewControllers,Views,Buttons,...数组,词典,...以及您的自定义类是referance类型