Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Swift 如有可能,请迅速投出_Swift - Fatal编程技术网

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
      }
   }