如果可能,迅速施放

时间:2017-08-09 16:20:32

标签: 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: {
                        self.postNotFoundLabel.isHidden = false
                    });
                }else if(first=="Empty"){
                    print("Empty")
                }
            }

我想要做的是将jsonData[0]转换为String,如果可能的话,如果不可行,那么继续前进。但是当应用程序不可能停止并给我一个错误时

Could not cast value of type '__NSDictionaryI' (0x1092054d8) to 'NSString' (0x108644508).

我怎样才能在可能的情况下施放?

4 个答案:

答案 0 :(得分:2)

您正在尝试强制转换为可选字符串。那不是你想要的。

变化:

if var first = jsonData[0] as! String? {

为:

if var first = jsonData[0] as? String {

这会尝试强制转换为String。如果jsonData[0]实际上不是字符串,则会nilif var失败。

您可能想要if let,而不是if var,因为您似乎没有对first进行任何更改。

答案 1 :(得分:2)

首先,JSON对象永远不会返回可选值,因此[Any?]是无意义的。

所有错误消息中的第二个说明强制转换为字符串的类型是不合适的,因为结果的类型实际上是字典

解决方案:检查StringDictionary

的类型
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)
}