为什么我可以有一个[AnyObject]
数组并在其中放入一堆不同大小的类型...
var a = [AnyObject]()
a.append(Int(1))
a.append(Float64(3.14))
a.append(Bool(true))
Run Code Online (Sandbox Code Playgroud)
...除了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'
Run Code Online (Sandbox Code Playgroud)
文档AnyObject
说:
"AnyObject可以表示任何类类型的实例"
但是当我命令点击Int
,Int32
或者Int64
看到这些类型的标准库定义时,我发现它们都是struct
值.
这里的根本问题是什么?为什么这样设计?
Air*_*ity 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)
Run Code Online (Sandbox Code Playgroud)
有人可能会认为应该有更多隐含的转换来润滑车轮,但话说再次,这些隐含的转换已经引起了很多混乱,最新beta的方向是减少它们而不是更多.
归档时间: |
|
查看次数: |
4535 次 |
最近记录: |