我如何在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!