【问题标题】:Error in Apple's Swift documentation on forced unwrapping in if statements?Apple 的 Swift 文档中关于强制展开 if 语句的错误?
【发布时间】:2024-05-21 09:15:02
【问题描述】:

我的iBook on "The Swift Programming Language" 包含以下描述if 语句中强制展开的功能示例:

let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}
// prints "123 has an integer value of 123”

但这对我不起作用。 Xcode (6.0.1) 要求我明确地与nil 进行比较,如

if (convertedNumber != nil) {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

我的 iBook 错了吗?

【问题讨论】:

  • 请向 Radar (developer.apple.com/bug-reporting) 提交此错误 有一个特殊类别仅用于文档错误,Apple 有数百人通过此类错误报告并更新文档。但他们依靠我们来发现错误。
  • @AbhiBeckert:见answer below。看来这不是文档中的错误;这是 iBooks 更新(不)方式中的一个错误(或至少是一个缺点)。
  • 过时的原因并不重要,它仍然是一个需要修复的错误。如果您提交文档错误,它将被转发给 iBooks 团队的合适人员。

标签: swift


【解决方案1】:

是的,它是错误的,或者更好的是,它已经过时了。该行为在 2014 年 4 月 8 日发布时发生了更改,您可以查看更改日志 here。相关部分:

当它们有值时,Optionals 不再隐式地计算为 true,而当它们没有值时,它们不再隐式地计算为 false,以避免在使用可选的 Bool 值时产生混淆。相反,使用 ==!= 运算符对 nil 进行显式检查,以查明可选项是否包含值。


话虽如此,你可以去掉括号

if convertedNumber != nil {
    ...
}

【讨论】:

  • 哇。我想知道为什么我的 iBook 没有更新(删除并重新下载成功了;但我不应该这样做,不是吗?)。我想知道有多少人在阅读过时的文档(和我一样认为它会自动更新!)。
  • 不,我猜不是,但即使我链接的版本也不是最新的(我敢肯定有一个从 9 月开始有一些修订,但我找不到了)
  • 太糟糕了。网络上充斥着tutorials that have this wrong
  • 是的。 iBooks 似乎在更新到较新版本时遇到了真正的问题。每当有版本发布时,我总是必须删除并重新下载 Swift 书。从一开始就拥有一本关于新语言的体面书籍很不错,但 iBooks 似乎并不是最好的分发系统。