Swift使用'as'运算符将Bool强制转换为NSNumber

Ana*_*sia 7 casting ios swift

我在我的项目中发现了一个有趣的代码,我想知道它是如何工作的.如果我简化它,在游乐场看起来像这样:

var b: Bool = true
var n: NSNumber = b as NSNumber
Run Code Online (Sandbox Code Playgroud)

我不明白为什么as运营商投BoolNSNumber.文档as给出了使用它的唯一示例,即用于检查数组中元素的类型[Any].这是Docs的一个例子,这就是我期望的as用法:

var things = [Any]()
for thing in things {
    switch thing {
    case 0 as Int:
    case 0 as Double:
Run Code Online (Sandbox Code Playgroud)

我没想到as会做一个真正的演员.我在哪里可以阅读更多相关信息?当我尝试类似的代码Int代替NSNumber,它不会编译:

var b: Bool = true
var n: Int = b as Int --> doesn't compile
Run Code Online (Sandbox Code Playgroud)

NSNumber似乎是一个特例?我糊涂了.任何人都可以阐明这一点吗?

Dáv*_*tor 9

as操作可用于两种类型的铸件.型铸造和桥梁铸造.类型转换可用于将子类转换为超类(称为upcasting)或向下转换超类转换为子类(仅在首次提升子类实例时才有效).这是您在示例中看到的Any数组.

然而,桥接构建是一种机制,用于更容易地FoundationSwift类之间的互操作性.NSNumber有一个init方法,它接受一个Bool输入参数.as您的示例中的运算符调用此初始值设定项,因此

var b: Bool = true
var n: NSNumber = b as NSNumber
Run Code Online (Sandbox Code Playgroud)

只是一个简写符号

var b:Bool = true
var n = NSNumber(value: b)
Run Code Online (Sandbox Code Playgroud)

Int并且Bool都是Swift类型,因此桥接器不适用于它们.

有关更多信息,请查看NSNumber文档.