【问题标题】:ios Swift Could not cast value of type '__NSCFBoolean' (0x10da97608) to 'NSArray' (0x10da97e28)ios Swift 无法将“__NSCFBoolean”(0x10da97608)类型的值转换为“NSArray”(0x10da97e28)
【发布时间】:2017-04-03 16:59:17
【问题描述】:

我正在尝试解析 .json 文件,但由于此错误,我无法最终确定它。我怎样才能避免这种情况?我搜索但我找不到它。 错误:“无法将 '__NSCFBoolean' (0x10da97608) 类型的值转换为 'NSArray' (0x10da97e28)。”

if (Dict["gorsel"] != nil) {
            let gorsel = Dict["gorsel"] as! NSArray;
            self.Image = gorsel[0] as! String as NSString;
            self.ImageInfo = ImageSpecs(width: gorsel[1] as! Int, height: gorsel[2] as! Int);
            self.ImageAvailable = true;
            if (self.Image.lowercased.contains("ö") ||
                self.Image.lowercased.contains("ç") ||
                self.Image.lowercased.contains(" ") ||
                self.Image.lowercased.contains("ğ") ||
                self.Image.lowercased.contains("ş") ||
                self.Image.lowercased.contains("ü") ||
                self.Image.lowercased.contains("ı")) {
                self.ImageAvailable = false;
            }
        }

【问题讨论】:

  • Dict["gorsel"] 是一个布尔值。确保您的代码遵循正确的 JSON 格式。
  • 你能发布你试图解析的 json 吗?
  • 你为什么要把东西投给NSString和NSArray?这是斯威夫特。使用 Swift 类型。为什么要一遍又一遍地在self.Image 上打电话给lowercased?只做一次。最后,请使用标准命名约定。类名以大写字母开头。函数名和变量名应以小写字母开头。
  • 另外,你真的应该避免使用as!。如果这些值是 nil 或实际上不是您声明的类型,您的应用程序将崩溃。您应该安全地打开并转换这些值。

标签: ios arrays json swift nsmutablearray


【解决方案1】:

错误:“无法将 '__NSCFBoolean' (0x10da97608) 类型的值转换为 'NSArray' (0x10da97e28)。"

表示您将布尔值强制转换为数组,这意味着 Dict["gorsel"] 是一个布尔值,而您试图将它转换为 array 引发异常和崩溃。

为避免此类崩溃,您应该使用关键字 ! 和 ? 。

在哪里!表示我确定

?表示我不确定

所以根据你的代码

let gorsel = Dict["gorsel"] as! NSArray;

您确定 Dict["gorsel"] 将是一个数组,但实际上是一个布尔值。所以 @kennytm

回答最好的方法是

if let gosrel = Dict["gorsel"] as? NSArray {
    self.Image = gorsel[0] as! NSString as String
    // etc.
}

您只是假设它是数组,并且只有如果它有一个非零数组,才执行进一步的代码。

【讨论】:

    【解决方案2】:

    “无法将 '__NSCFBoolean' (0x10da97608) 类型的值转换为 'NSArray' (0x10da97e28)。”

    __NSCFBoolean 是一个“布尔”对象。引发错误是因为您想将布尔值强制转换为 NSArray,这表明该行有问题:

            let gorsel = Dict["gorsel"] as! NSArray;
    

    所以我们看到Dict["gorsel"] 实际上是一个布尔值(true 或false),但您期望它是一个数组。

    要么 JSON 错误,要么代码暗示的假设错误。

    如果你想同时处理数组和布尔值,你可以使用as?而不是as!,这样当转换失败时,它只返回nil而不是崩溃。

    if let gosrel = Dict["gorsel"] as? NSArray {
        self.Image = gorsel[0] as! NSString as String
        // etc.
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2017-04-09
      • 1970-01-01
      相关资源
      最近更新 更多