如何在 swift 3.0 中连接多个可选字符串?
How can I concatenate multiple optional strings in swift 3.0?
我正在尝试在 swift 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!
~~~~~~~~^~~~
这曾经在 swift 2 中有效。我不确定为什么它不再有效了。
OP 提交的错误报告:
已解决(已于 2017 年 1 月 3 日提交给 master 修复),因此在即将推出的 Swift 3.1.
中应该不再是问题
这似乎是一个错误(在 Swift 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,我不确定这是否真的是 "bug",以及政策是什么 w.r.t。在尚未生产的代码版本中报告 "bugs",但您可能应该为此提交雷达,以防万一。
关于如何规避这个问题的回答:
- 使用例如中的中间变量不存在错误:上面的示例 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"
})
Swift 3
let q: String? = "Hello"
let w: String? = "World"
let r: String? = "!"
var array = [q, w, r]
print(array.flatMap { [=10=] }.reduce("", {[=10=] + }))
// HelloWorld!
let q: String? = "Hello"
let w: String? = nil
let r: String? = "!"
var array = [q, w, r]
print(array.flatMap { [=10=] }.reduce("", {[=10=] + }))
// Hello!
func getSingleValue(_ value: String?..., seperator: String = " ") -> String? {
return value.reduce("") {
([=10=]) + seperator + ( ?? "")
}.trimmingCharacters(in: CharacterSet(charactersIn: seperator) )
}
var a:String? = "a"
var b:String? = "b"
var c:String? = "c"
var d:String? = ""
let arr = [a,b,c]
arr.compactMap { [=10=] }.joined(separator: " ")
compactMap 用于从展平数组中过滤掉 nil 值
我正在尝试在 swift 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!
~~~~~~~~^~~~
这曾经在 swift 2 中有效。我不确定为什么它不再有效了。
OP 提交的错误报告:
已解决(已于 2017 年 1 月 3 日提交给 master 修复),因此在即将推出的 Swift 3.1.
中应该不再是问题这似乎是一个错误(在 Swift 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,我不确定这是否真的是 "bug",以及政策是什么 w.r.t。在尚未生产的代码版本中报告 "bugs",但您可能应该为此提交雷达,以防万一。
关于如何规避这个问题的回答:
- 使用例如中的中间变量不存在错误:上面的示例 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"
})
Swift 3
let q: String? = "Hello"
let w: String? = "World"
let r: String? = "!"
var array = [q, w, r]
print(array.flatMap { [=10=] }.reduce("", {[=10=] + }))
// HelloWorld!
let q: String? = "Hello"
let w: String? = nil
let r: String? = "!"
var array = [q, w, r]
print(array.flatMap { [=10=] }.reduce("", {[=10=] + }))
// Hello!
func getSingleValue(_ value: String?..., seperator: String = " ") -> String? {
return value.reduce("") {
([=10=]) + seperator + ( ?? "")
}.trimmingCharacters(in: CharacterSet(charactersIn: seperator) )
}
var a:String? = "a"
var b:String? = "b"
var c:String? = "c"
var d:String? = ""
let arr = [a,b,c]
arr.compactMap { [=10=] }.joined(separator: " ")
compactMap 用于从展平数组中过滤掉 nil 值