不需要在 Swift 中解开选项?

Posted

技术标签:

【中文标题】不需要在 Swift 中解开选项?【英文标题】:No need to unwrap optionals in Swift? 【发布时间】:2014-06-04 14:34:23 【问题描述】:

我想我对“展开”可选值的概念感到困惑,非常感谢任何指导!

根据 Swift 编程语言指南,一个可选项需要在使用前解包,除非它使用 ! 隐式解包。

来自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/gb/jEUH0.l:

let possibleString: String? = "An optional string."

println(possibleString!) // requires an exclamation mark to access its value

let assumedString: String! = "An implicitly unwrapped optional string."

println(assumedString) // no exclamation mark is needed to access its value

但是,在 Xcode 中,我可以执行以下操作并仍然打印可选字符串的值:

let teamname: String? = "Liverpool!"

println("Come on \(teamname)")

我错过了什么?

【问题讨论】:

查看我的回答here。此外,字符串插值会自动解开您的对象。 这是一个非常清楚的解释,所以谢谢,但恐怕我还是有点困惑。它是否是该答案的底部 - 即“第一种情况和后两种情况之间的区别在于,如果 optionalSquare 设置为 nil,后两种情况会给你一个运行时错误”? 我添加了一个您可能没有在评论中发现的 ninja 编辑 - 字符串插值会自动解开您的对象。 我写了一篇关于可选的文章,可能会有所帮助。有关字符串自省的问题,请参阅“粗略”部分。 medium.com/@rrridges/swift-optionals-a10dcfd8aab5 @CezaryWojcik 谢谢,我不知道!但是,即使我只写 println(teamname),字符串仍然会展开 【参考方案1】:

首先,仅当您在不允许使用可选项的地方使用可选项时,才需要解包。 (例如,将 String? 分配给 String

var optionalString: String? = "Some string"
var absolutelyAString: String = "Another string"
// absolutelyAString = optionalString // Error. Needs to unwrap
absolutelyAString = optionalString! // OK. 

“Unwrap”的基本意思是“保证值不为零”。只需将其视为强制转换为不可为空的类型。

其次,println() 接受选项就好了,但因为它会为你检查你的变量。如果变量的值为nil,则打印“nil”;否则它会打印由StreamablePrintableDebugPrintable 协议实现的字符串。

【讨论】:

【参考方案2】:

可选的需要解包,但您不必总是自己做。

var teamname: String? = "Liverpool"
println("Come on \(teamname)")

在这种情况下,字符串插值将检查可选项,然后将其解包并将其值添加到字符串中。如果 Optional 为 nil,则会在 String 中添加“nil”。

为了访问 String 的属性和方法,您必须显式地打开它。如果你不知道它是否为 nil,你应该用 if 语句检查。

if teamname != nil 
    var newName = teamname!.capitalizedString

【讨论】:

以上是关于不需要在 Swift 中解开选项?的主要内容,如果未能解决你的问题,请参考以下文章

为啥你可以在 Swift 中为可选类型分配非可选值?

Swift 3 更好的方式来解开一个可选的

在 Swift 中解开 CBOR 解码的数据

如何在 Swift 4 中安全地解开字典值?

如何在 Swift 2.0 中正确解开这些 CLPlacemarks?

如何在 Swift 的绑定中解开可选值?