核心数据类和获取请求问题

Posted

技术标签:

【中文标题】核心数据类和获取请求问题【英文标题】:Core Data class and fetch request issue 【发布时间】:2015-12-29 17:52:38 【问题描述】:

我对使用 Core Data (XCode 7.1 / Swift 2.0) 的错误感到困惑

以下代码运行良好

class DB_PlayerData: NSManagedObject

    @NSManaged var playerID: NSNumber


class PlayerClass

    var IDPlayer: Int = 0


func test()

    let LocalAppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let ManagedObjectContext = LocalAppDelegate.managedObjectContext
    var SelectAll = NSFetchRequest()
    var ResultatRecherche: NSArray = []
    var gPlayerData = PlayerClass()


    SelectAll = NSFetchRequest(entityName: eNomDBFiles.DB_PlayerData.rawValue)
    try! ResultatRecherche = ManagedObjectContext?.executeFetchRequest(SelectAll) as! [DB_PlayerData]
    if (ResultatRecherche.count == 1)
    
        gPlayerData.IDPlayer = Int(ResultatRecherche[0].playerID)
    
    else
    
        // Do something
    

但是如果test 函数与DB_PlayerData 类声明不在我的项目中的同一个swift 文件中,我会收到以下错误:Value of type 'AnyObject' has no member 'playerID'

实体已在 Xcode 的 DB 模型中创建,名称和类等于 DB_PlayerData,并且模块设置为项目名称。我已经尝试了这里描述的所有类型的设置选项,但都没有成功。

有什么线索吗?

【问题讨论】:

请注意,每个变量名都以小写字母开头,每个单词之后以大写字母开头是很好的做法。例如,不是ResultatRecherche,而是resultatRecherche。这称为 lowerCamelCase。 【参考方案1】:

你还没有告诉编译器你的数组中包含了哪种类型。

    var ResultatRecherche: [DB_PlayerData] = []

而不是

    var ResultatRecherche: NSArray = []

我建议您始终尝试使用正确的 swift 类型,而不是 NSArray 等基础类型。如果您绝对必须使用NSArray,则需要在尝试访问属性之前将ResultatRecherche[0] 转换为正确的类型,否则它将具有AnyObject 的类型。

【讨论】:

当我输入try! ResultatRecherche = ManagedObjectContext?.executeFetchRequest(SelectAll) as! [DB_PlayerData] 时,我指出了数组的类型,并且在访问属性之前我会这样做。还是我错过了什么? 尽管如此,ResultatRecherche 仍然是它的超类 NSArray 的一种类型,编译器并不知道它实际包含什么。 您的解决方案确实有效。谢谢,即使我仍然不明白它的逻辑。

以上是关于核心数据类和获取请求问题的主要内容,如果未能解决你的问题,请参考以下文章

保存核心数据中断获取请求

NSSortDescriptor 对核心数据获取请求没有影响

大型数据集上的核心数据获取请求缓慢

带有数组的核心数据获取请求

使用子查询高效获取核心数据

获取复杂请求核心数据的谓词和表达式