【问题标题】:Could not cast value of type '__NSCFNumber' () to 'NSArray' swift无法将“__NSCFNumber”()类型的值快速转换为“NSArray”
【发布时间】: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!

标签: ios xcode swift swift2


【解决方案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 循环中打印它吗?
    猜你喜欢
    • 2017-09-26
    • 2017-04-09
    • 1970-01-01
    • 2017-11-17
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多