如何在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 */
答
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!
感谢您的回答,我提交了错误[这里](https://bugs.swift.org/浏览/ SR-1122) – DMSilva