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