gpt4 book ai didi

swift - 任何?不正确的语义

转载 作者:行者123 更新时间:2023-12-02 09:05:27 25 4
gpt4 key购买 nike

我正在使用 swift 编写一些代码,遇到了一个有趣的情况。让我们从一些序言开始:假设您创建一些可选变量:

let a: String? = "abcd"; let b: Int? = 4
print(
"Type of \(a) is \(type(of: a))" //Type of Optional("abcd") is Optional<String>
"Type of \(b) is \(type(of: b))", //Type of Optional(4) is Optional<Int>
separator: "\n"
)

然后你强制解开这样类型的 aubu不是可选的。

let au = a!; let bu = b!
print(
"Type of \(au) is \(type(of: au))", //Type of abcd is String
"Type of \(bu) is \(type(of: bu))", //Type of 4 is Int

au + String(bu), //abcd4
separator: "\n"
)

看起来很合理,但是当您尝试将相同的代码应用于 Optional<Any> 时,事情开始变得奇怪。 :

let a: Any? = "abcd"; let b: Any? = 4
let au = a!; let bu = b!
print(
"Type of \(a) is \(type(of: a))", //Type of Optional("abcd") is Optional<Any>
"Type of \(b) is \(type(of: b))", //Type of Optional(4) is Optional<Any>
"Type of \(au) is \(type(of: au))", //Type of abcd is String
"Type of \(bu) is \(type(of: bu))", //Type of 4 is Int
//au + String(bu),
separator: "\n"
)

但是现在如果你尝试做同样的串联 au + String(bu) , swift 会产生编译错误,即使这两个变量已知为某种具体类型(如 swift 本身所报告的那样)。错误是:

error: protocol type 'Any' cannot conform to 'LosslessStringConvertible' because only concrete types can conform to protocols

这看起来确实像一个错误,不是吗?请分享您的意见。

最佳答案

正如其他人所指出的,type(of:) 是值的动态运行时类型。编译器仅依赖于值的静态、可证明类型。在上面的代码中,编译器唯一可以证明的是 au 的类型为 Any。 String 是符合 Any 的众多类型之一,但编译器不知道在所有可能的代码路径中,该值实际上都是 String。

由于没有 func + (Any, String) 重载,因此无法编译。

请注意,Any? 是一种奇怪且危险的类型。它的问题并不是这个示例的原因,但它与可选升级交互的方式可能会导致严重的歧义和困惑。 Swift 中的每种类型都可以隐式提升为该类型的Optional。 Swift 中的每种类型都可以隐式转换为 Any。结合这两个事实意味着 Any 可以隐式提升为 Any?Any??Any??? 等,但所有这些也是 Any 的子类型。这可能会造成各种微妙的头痛。您应该强烈避免使用 Any;它很少是正确的工具。但您应该更加小心地允许 Any? 显示在您的代码中。这表明可能出现了问题。

关于swift - 任何?不正确的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59070838/

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