gpt4 book ai didi

swift 问题 : About Type Casting for AnyObject

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:13 25 4
gpt4 key购买 nike

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

最佳答案

这有点令人困惑,因为 Swift 对 Objective-C 做了桥接,其中大多数东西都是类,而值类型较少。要查看 Swift 在没有桥的情况下做了什么,请创建一个新的 playground 并删除顶部的 import ... 语句,然后尝试转换 IntAny(没问题)和 AnyObject:

let num = 23                               // 23
let anyNum: Any = num // 23
let anyObjectNum: AnyObject = num
// error: type 'Int' does not conform to protocol 'AnyObject'

现在在你的 playground 顶部添加 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 中的数字类型,它在一些有趣的情况下返回 true:

anyNum is Int                              // true
anyNum is Double // false
anyObjectNum is Int // true
anyObjectNum is UInt // true
anyObjectNum is Double // true
anyObjectNum is Float // true

关于 swift 问题 : About Type Casting for AnyObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26581591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com