我有以下几行代码:
let string:String = ""
let extracted_data:String! = (response?.extracted_data == nil) ? "" : response?.extracted_data
string.append("\(extracted_data)")
extracted_data
是[Any]
。我无法弄清楚为什么会收到此错误:
'中的结果值:'表达式有不匹配的类型' String'和' [任何]?'
答案 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)