Swift问题:关于AnyObject的类型转换

时间:2014-10-27 05:22:01

标签: swift

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数组中吗?

1 个答案:

答案 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