我有这段代码
let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as! [Any?]
if var first = jsonData[0] as! String?{
if(first=="Error"){
DispatchQueue.main.async(execute: {
self.postNotFoundLabel.isHidden = false
});
}else if(first=="Empty"){
print("Empty")
}
}
我想要做的是将jsonData[0]
转换为String,如果可能的话,如果不可行,那么继续前进。但是当应用程序不可能停止并给我一个错误时
Could not cast value of type '__NSDictionaryI' (0x1092054d8) to 'NSString' (0x108644508).
我怎样才能在可能的情况下施放?
答案 0 :(得分:2)
您正在尝试强制转换为可选字符串。那不是你想要的。
变化:
if var first = jsonData[0] as! String? {
为:
if var first = jsonData[0] as? String {
这会尝试强制转换为String。如果jsonData[0]
实际上不是字符串,则会nil
而if var
失败。
您可能想要if let
,而不是if var
,因为您似乎没有对first
进行任何更改。
答案 1 :(得分:2)
首先,JSON对象永远不会返回可选值,因此[Any?]
是无意义的。
所有错误消息中的第二个说明强制转换为字符串的类型是不合适的,因为结果的类型实际上是字典。
解决方案:检查String
和Dictionary
if let jsonData = try JSONSerialization.jsonObject(with: data) as? [Any],
let first = jsonData.first {
if let firstIsDictionary = first as? [String:Any] {
// handle case dictionary
} else if let firstIsString = first as? String {
// handle case string
}
}
PS:类型转换强制解包可选(as! String?
)也是无稽之谈。
答案 2 :(得分:0)
如果您不确定转换是否成功,请不要使用as!
。 as
关键字后面的感叹号会强制转换,如果转换不成功则会引发错误。
使用as?
代替,它返回您尝试转换为的类型的可选变量。如果转换失败,而不是抛出错误,它只返回nil。
let jsonData = try JSONSerialization.jsonObject(with: data) as? [Any]
if var first = jsonData.first as? String{
if(first=="Error"){
DispatchQueue.main.async(execute: {
self.postNotFoundLabel.isHidden = false
});
}else if(first=="Empty"){
print("Empty")
}
}
答案 3 :(得分:0)
这是您正在做的事情的Swifty方式:)
guard let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as? [Any?], let first = jsonData[0] as? String else {
DispatchQueue.main.async(execute: {
self.postNotFoundLabel.isHidden = false
});
return
}
if(first == "Empty") {
print(first)
}