swift - 为什么可以将非可选值分配给 Swift 中的可选类型?

标签 swift

为什么涉及 Swift 可选类型的赋值会进行类型检查? 例如在,

 var foo : Int? = 0
 foo = foo!

噗噗噗!没有相同的类型。您不需要包装未包装的值以将其分配给可选类型吗?

最佳答案

这是可选项背后的语法糖的一部分。分配非可选值是如何将其包装在可选类型中。

由于可选指示值的存在或不存在,因此除了提供一个值之外,您不必执行任何特殊操作来指示值的存在。例如,在函数中:

func gimmeSomethingMaybe() -> String? {
    if arc4random_uniform(10) > 7 {
        return "something"
    } else {
        return nil
    }
}

想象一下,如果每次您想从一个能够返回 nil 的函数返回一个真实值,您都必须编写 return Optional(value)。那会很快变老,对吧?可选值是该语言的一个重要特性——尽管它们实际上是由标准库实现的,但语法糖/自动包装可以避免使用它们变得乏味。


编辑:只是更深入地探讨这个问题……糖分还有助于强化真实值不应该是可选的概念。例如:

let one = 1
one? // error (in Swift 1.2, allowed but meaningless in Swift 1.1)
"two"? // error (ditto)

您可以使用 Optional(one) 初始值设定项创建一个可选的包装真实值,但它本身没有什么语义意义,因此您几乎不需要这样做。

当一个值是否存在存在“神秘”时,可选值应该发挥作用——也就是说,当程序的一部分是否接收到一个值(或没有值)取决于该部分未知的状态时程序。如果你知道你有一个真正的值(value),那就没有什么神秘的......相反,你让未知在知道该值的代码和不知道该值的代码之间的边界上发挥作用 - 即函数/方法/将值传递给某个地方的属性定义。

关于swift - 为什么可以将非可选值分配给 Swift 中的可选类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28570587/

相关文章:

Swift Core Data - DataModel 实体关系

swift - 快速点击栏按钮上的退出键盘

ios - 使用 AudioEngine 的音效

swift - 为segue延迟做好准备。信息滞后但正在呈现

ios - 笑脸评分栏 swift

swift - 'UIFont' 不可转换为 'UIFont?'

swift - UIDatePicker 只显示周日的日期吗?

linux - 如何在 Kitura 中测试 CORS?

swift - 如何让函数中的这个按钮用 Swift 打开另一个 View Controller ?

xcode - 用于构建swift的SDK版本?