Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在swift 3.0中连接多个可选字符串?_String_Swift_Swift3 - Fatal编程技术网

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

String 如何在swift 3.0中连接多个可选字符串?,string,swift,swift3,String,Swift,Swift3,我试图在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 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中不再是一个问题


这似乎是一个与以下情况相关的bug(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!)
错误不存在:

// 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.在尚未生产的代码版本中报告“bug”的策略是什么,但可能您应该为此提交雷达,以防万一

关于如何规避这一问题,请回答您的问题:

  • 例如,使用上述示例2中未出现的错误中的中间变量
  • 或者明确地告诉Swift,3项表达式中的所有术语都是字符串,如上面的示例3中的Bug not present所示
  • 或者,更好的方法是使用可选的安全展开,例如使用可选绑定:

Swift 3
compactMap可用于从展平数组中过滤出nil值

谢谢你的回答,我在你的代码可能运行时提交了一个bug,如果你能在回答中添加一些解释就好了。
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!
func getSingleValue(_ value: String?..., seperator: String = " ") -> String? {

    return value.reduce("") {
        ($0) + seperator + ($1 ?? "")
        }.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 { $0 }.joined(separator: " ")