我如何在swift 3.0中连接多个可选string?
我想连接多个string在迅速3:
var a:String? = "a" var b:String? = "b" var c:String? = "c" var d:String? = a! + b! + c!
编译时出现以下错误:
error: cannot convert value of type 'String' to specified type 'String?' var d:String? = a! + b! + c! ~~~~~~~~^~~~
这曾经工作在迅速2.我不知道为什么它不工作了。
由OP提交的错误报告:
- SR-1122:未能在强制展开的值上检查二元运算符链
已经解决了(修正了2017年1月3日的版本),因此在即将到来的Swift 3.1中不再是个问题。
这似乎是一个错误(在Swift 2.2中不存在,只有3.0)与以下情况相关:
- 在expression式中使用强制展开运算符(
!
)至less3个项(使用至less2个基本运算符(例如,+
或-
)进行testing)。 - 出于某种原因,鉴于上述情况,Swift会混淆expression式的types推断(具体来说,对于expression式中的
x!
词本身而言)。
对于下面的所有例子,让:
let a: String? = "a" let b: String? = "b" let c: String? = "c"
目前的错误:
// example 1 a! + b! + c! /* error: ambiguous reference to member '+' */ // example 2 var d: String = a! + b! + c! /* error: ambiguous reference to member '+' */ // example 3 var d: String? = a! + b! + c! /* error: cannot convert value of type 'String' to specified type 'String?' */ // example 4 var d: String? d = a! + b! + c! /* error: cannot assign value of type 'String' to specified type 'String?' */ // example 5 (not just for type String and '+' operator) let a: Int? = 1 let b: Int? = 2 let c: Int? = 3 var d: Int? = a! + b! + c! /* error: cannot convert value of type 'Int' to specified type 'Int?' */ var e: Int? = a! - b! - c! // same error
错误不存在:
/* example 1 */ var d: String? = a! + b! /* example 2 */ let aa = a! let bb = b! let cc = c! var d: String? = aa + bb + cc var e: String = aa + bb + cc /* example 3 */ var d: String? = String(a!) + String(b!) + String(c!)
但是,因为这是Swift 3.0- dev ,我不确定这是否真的是一个“bug”,以及在尚未生产的代码版本中报告“错误”的策略是什么,但可能需要将雷达为此,以防万一。
至于回答你的问题,如何绕开这个问题:
- 使用例如Bug中不存在的中间variables:上面的例子2 ,
- 或者明确地告诉Swift,3字expression式中的所有术语都是string,如Bug中不存在的:例3 ,
-
或者更好的是,使用可选的绑定来安全的展开你的可选的绑定 :
var d: String? = nil if let a = a, b = b, c = c { d = a + b + c } /* if any of a, b or c are 'nil', d will remain as 'nil'; otherwise, the concenation of their unwrapped values */
let val: String? = "nil" val.flatMap({(str: String) -> String? in return str + "value" })
Swift 3
let q: String? = "Hello" let w: String? = "World" let r: String? = "!" var array = [q, w, r] print(array.flatMap { $0 }.reduce("", {$0 + $1})) // HelloWorld! let q: String? = "Hello" let w: String? = nil let r: String? = "!" var array = [q, w, r] print(array.flatMap { $0 }.reduce("", {$0 + $1})) // Hello!