Swift提供了两种特殊类型别名,用于处理非特定类型:
AnyObject可以表示任何类类型的实例。
根据官方文件:上面提到并考虑以下案例
class Person {
var name = "new name"
init(name: String) {
self.name = name
}
}
var people: [AnyObject] = [Person(name: "Allen"), Person(name: "Hank"), 23]
为什么呢?我可以将23(Int
是一个结构体)添加到people
数组中吗?
答案 0 :(得分:4)
这有点令人困惑,因为Swift对Objective-C进行了桥接,其中大多数东西都是类,而且值类型更少。要查看Swift在没有桥的情况下做什么,请创建一个新的游乐场并删除顶部的import ...
语句,然后尝试将Int
投射到Any
(否)问题)和AnyObject
:
let num = 23 // 23
let anyNum: Any = num // 23
let anyObjectNum: AnyObject = num
// error: type 'Int' does not conform to protocol 'AnyObject'
现在在游乐场的顶部添加import Foundation
:
import Foundation
let num = 23 // 23
let anyNum: Any = num // 23
let anyObjectNum: AnyObject = num // 23
错误消失了 - 为什么?当它看到将Int
转换为AnyObject
的尝试时,Swift首先将num
桥接为Objective {C NSNumber
类的实例,可在Foundation
中找到},然后将其强制转换为所需的AnyObject
。你的数组中也会发生同样的事情。
您可以或多或少地使用is
关键字证明这种情况 - 因为NSNumber
桥接到所有 Swift中的数字类型,它返回{{1}在一些有趣的案例中:
true