无法将“__NSCFNumber”()类型的值快速转换为“NSArray”

Posted

技术标签:

【中文标题】无法将“__NSCFNumber”()类型的值快速转换为“NSArray”【英文标题】:Could not cast value of type '__NSCFNumber' () to 'NSArray' swift 【发布时间】:2015-08-29 17:29:48 【问题描述】:

为什么不能将 NSCFNumber(核心数据)转换为 NSArray?

错误:

无法将“__NSCFNumber”(XXXXXXXX)类型的值转换为“NSArray” (XXXXXXXX)。

代码:

//Fetch Settings
    func fetchAccounSetting()
        let entityDescription = NSEntityDescription.entityForName("UserSettings", inManagedObjectContext: Context!)
        let request = NSFetchRequest()
        //let data = UserSettings(entity: entityDescription!, insertIntoManagedObjectContext: Context)
        request.entity = entityDescription

        var dataObjects: [AnyObject]?

        do 
            dataObjects = try Context?.executeFetchRequest(request)
         catch  let error as NSError 
            print(error)
            dataObjects = nil
        

        for result in dataObjects as! [NSManagedObject] 
            let dataSelected = NSArray(array: result.valueForKey("favCategory")! as! NSArray)
            print(dataSelected)
        

更新: 我怎样才能收到dataSelected 的计数?

【问题讨论】:

您不能将数字转换为数组,因为它们几乎不是同一类型的对象。 同样的原因我不能把我的车变成大象。它不是一个,并且说它是并没有使它如此。 favCategory 的值是 NSNumber,而不是数组,因此您的强制向下转换失败 嘿,如果 dataObjects 为 nil,你的 for 循环不会崩溃吗? (如果发生错误并且您的 fetch 请求抛出) @KelvinLau 是的 - 特别是 as! 断言如果结果是错误的会导致崩溃 @AaronBrager 确认。开始使用guard OP! 【参考方案1】:

Core Data 首先不能存储数组或字典。记得以前在学习的时候遇到过这个问题。

AKA,您的 dataObjects 数组没有任何可以类型转换为 NSArray 的内容。做到这一点的方法是对可以模仿数组的一对多关系(创建Set)进行建模。

【讨论】:

【参考方案2】:

result.valueForKey("favCategory")! 正在返回一个数字,但您似乎在期待一个数组。

也许你的意思是:

let dataSelected = [result.valueForKey("favCategory")!]

如果您知道要返回的类型,则可以选择强制转换它:

let dataSelected = [result.valueForKey("favCategory")!]

if let dataSelected = dataSelected as? [NSNumber] 
    // dataSelected is of type [NSNumber] a.k.a. Array<NSNumber>
    print(dataSelected)

【讨论】:

我怎样才能收到dataSelected的计数? 当我尝试dataSelected.count 时,它给了我最后的选择数,而不是总数。 不,它没有,它为您提供数组中的元素数量。 是的,唯一不同的是,当数组中有 2 个项目时,它会打印第一个数字两次。 那是因为你在 for 循环中打印它吗?

以上是关于无法将“__NSCFNumber”()类型的值快速转换为“NSArray”的主要内容,如果未能解决你的问题,请参考以下文章

无法从 JSON 中获取值(无法将类型“__NSCFNumber”(0x7fff87b9c520)的值转换为“NSDictionary”(0x7fff87b9d5b0))

[__NSCFNumber 长度]:无法识别的选择器发送到实例 0xb000000000000113'

ios [__NSCFNumber 长度]:发送到实例的无法识别的选择器

iOS报错[__NSCFNumber length]: unrecognized

[__NSCFNumber countByEnumeratingWithState:objects:count:]:发送到实例的无法识别的选择器

ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错