Swift 如有可能,请迅速投出
我有这个密码Swift 如有可能,请迅速投出,swift,Swift,我有这个密码 let jsonData = try JSONSerialization.jsonObject(with: data, options: []) as! [Any?] if var first = jsonData[0] as! String?{ if(first=="Error"){ DispatchQueue.main.async(execute: {
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]
强制转换为字符串,如果可能,如果不可能,则继续。但当不可能时,应用程序停止并给我一个错误
Could not cast value of type '__NSDictionaryI' (0x1092054d8) to 'NSString' (0x108644508).
如何仅在可能的情况下进行强制转换?您试图强制转换为可选字符串。那不是你想要的 更改:
if var first = jsonData[0] as! String? {
致:
这将尝试转换为字符串。如果jsonData[0]
实际上不是一个字符串,则会得到nil
和If var
失败
而且您可能想要
如果let
,而不是如果var
,因为您似乎没有首先对进行任何更改不要将用作代码>如果您不确定强制转换是否会成功。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")
}
}
以下是快速完成您正在做的事情的方法:)
首先,JSON对象永远不会返回可选值,因此[Any?]
毫无意义
第二条错误消息说转换为字符串的类型不合适,因为结果的类型实际上是一个字典
解决方案:检查字符串
和字典
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:optional(as!String?
)的强制展开可选类型也是毫无意义的。谢谢,这是一个打字错误。
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)
}
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
}
}