斯威夫特 3;用非可选字符串附加可选字符串

Posted

技术标签:

【中文标题】斯威夫特 3;用非可选字符串附加可选字符串【英文标题】:Swift 3; Appending optional string with non-optional string 【发布时间】:2016-07-06 14:02:51 【问题描述】:

我刚刚更新到 Xcode 8.0 beta 2 和 swift 3.0,我在一些现有的 swift 2.3 代码中遇到了关于可选字符串的错误:

二元运算符“+”不能应用于“字符串”类型的操作数和 “字符串!”

变量“store”是“Store”对象的一个​​实例,其属性为addressStreetaddressCity,均定义为var addressStreet: String!

addressLabel.text = ... 行出现错误

if store != nil 
    addressLabel.text = store!.addressStreet + String(", ") + store!.addressCity

我不明白!对我来说,似乎没有一个字符串是可选的,为什么会出现这个错误,我该如何解决?

【问题讨论】:

奇怪,这适用于 Swift 2.2 swiftlang.ng.bluemix.net/#/repl/577d1066fc6e90d25e4ad0d5 你真的不应该像这样滥用隐式展开的选项。 我相信这是一个已知的错误,详情请参阅this thread(错误报告here)。 我无法重现该问题,您能出示您的Store 课程代码吗? 这似乎是一个错误。用“,”替换 String(", ") 解决了我的问题。 【参考方案1】:

我不知道它为什么会崩溃,但下面的代码更安全并且没有'String' + 'String!' 问题。试试看:

if let store = store, street = store.addressStreet, city = store.addressCity 
    addressLabel.text = "\(street), \(city)"

【讨论】:

addressLabel.text = street + ", " + city 更好,IMO。 @AMomchilov "\(street), \(city)" 怎么样? street + ", " + city 对我来说看起来太 php 了 :) street + ", " + city 最简洁明了。如果超过 3-4 项,我会说joined 会更好 我同意@Arsen 的观点,即"\(street), \(city)" 更具可读性(而且它还有一个额外的好处是我们不必怀疑streetcity 是否是字符串)。

以上是关于斯威夫特 3;用非可选字符串附加可选字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过应用过滤器摆脱 nil 后将类型更改为非可选

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

Xcode NSManagedObject 子类在它们被标记为非可选时包含可选

问题:我的非可选变量为零。 (展开时出现致命错误)

检查 nil 的非可选值

Swift 字符串与字符串!与字符串?