如何在'中修复此结果值? :'表达式有不匹配的类型' String'和' [任何]?'

时间:2017-04-06 09:46:24

标签: swift ternary-operator

我有以下几行代码:

let string:String = ""
let extracted_data:String! = (response?.extracted_data == nil) ? "" : response?.extracted_data
string.append("\(extracted_data)")

extracted_data[Any]。我无法弄清楚为什么会收到此错误:

  

'中的结果值:'表达式有不匹配的类型' String'和' [任何]?'

2 个答案:

答案 0 :(得分:2)

你应该将你的变量解析为[Any]类型的数组,如果你知道你的数组包含你应该这样做的字符串类型。从数组中取出第一个元素并设置值

response?.extracted_data?.first as? String ?? "Default Value if string is not present"

答案 1 :(得分:1)

三元运算符? :返回的值必须是相同的类型,因为Swift需要在编译时知道extracted_data的类型。您正在尝试返回String[Any]?。要解决此问题,请为[]案例返回空数组"",而不是空字符nil。此外,您需要解开response,以便response!.extracted_data返回[Any]而不是[Any]?。虽然使用!强行解包可能会导致崩溃,但这是安全的,因为您已经知道response由于您的检查而不是nil

var string: String = ""  // This needs to be a var for append to work
let extracted_data = response?.extracted_data == nil ? [] : response!.extracted_data
string.append("\(extracted_data)")

print(string)

现在看看这一行:

let extracted_data = response?.extracted_data == nil ? [] : response!.extracted_data

使用特殊的 nil合并运算符 ??,Swift有更好的方法。它用于展开可选值或为该值nil时提供默认值。使用??,该行变为:

let extracted_data = response?.extracted_data ?? []

我认为这是一个简化的示例,因为您只能分配到string而不是附加。在任何一种情况下,字符串都需要被修改var并且可以推断其类型。这是代码的最终版本:

var string = ""

let extracted_data = response?.extracted_data ?? []
string.append("\(extracted_data)")

print(string)

也许您不希望在[]时打印response == nil。在这种情况下,让? :像这样返回String

var string = ""

let extracted_data = response == nil ? "" : "\(response!.extracted_data)"
string.append(extracted_data)

print(string)

如果您只想打印[Any]数组的第一项,它实际上可以是任何类型,那么您可以这样做:

var string = ""

let first = response?.extracted_data.first
let extracted_data = first == nil ? "" : "\(first!)"
string.append(extracted_data)

print(string)