如何在swift 3.0中连接多个可选字符串?

问题描述:

我试图串连在迅速3多个字符​​串:如何在swift 3.0中连接多个可选字符串?

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申请

错误报告:

其中已经解决了(FIX致力于为掌握2017年1月3日),并应因此不再是一个问题,在即将到来的雨燕3.1。


这似乎是一个错误(在夫特2.2不存在,只有3.0)与的情况下,相关联的:

  • 使用*解开操作者(!),用于在一个至少3项表达式(使用至少2个基本运营商进行测试,例如+-)。
  • 由于某些原因,鉴于上述情况,Swift会混淆表达式的类型推断(具体而言,对于表达式中的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,我不确定这是否真的是一个“错误”,以及什么是政策w.r.t.在尚未生产的代码版本中报告“错误”,但可能需要为此提供雷达,以防万一。

至于回答你的问题,如何来解决这个问题:

  • 例如使用中间变量如错误不存在:实施例2以上,
  • 或明确地告诉Swift在3-术语表达的所有术语都是字符串,如在错误不存在:实施例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 */ 
    
+2

感谢您的回答,我提交了错误[这里](https://bugs.swift.org/浏览/ SR-1122) – DMSilva

let val: String? = "nil" 

val.flatMap({(str: String) -> String? in 
    return str + "value" 
}) 

斯威夫特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!