不需要在 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”;否则它会打印由Streamable
、Printable
或DebugPrintable
协议实现的字符串。
【讨论】:
【参考方案2】:可选的需要解包,但您不必总是自己做。
var teamname: String? = "Liverpool"
println("Come on \(teamname)")
在这种情况下,字符串插值将检查可选项,然后将其解包并将其值添加到字符串中。如果 Optional 为 nil,则会在 String 中添加“nil”。
为了访问 String 的属性和方法,您必须显式地打开它。如果你不知道它是否为 nil,你应该用 if 语句检查。
if teamname != nil
var newName = teamname!.capitalizedString
【讨论】:
以上是关于不需要在 Swift 中解开选项?的主要内容,如果未能解决你的问题,请参考以下文章