【问题标题】: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。

标签: ios xcode swift core-data


【解决方案1】:

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

    var ResultatRecherche: [DB_PlayerData] = []

而不是

    var ResultatRecherche: NSArray = []

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

【讨论】:

  • 当我输入try! ResultatRecherche = ManagedObjectContext?.executeFetchRequest(SelectAll) as! [DB_PlayerData] 时,我指出了数组的类型,并且在访问属性之前我会这样做。还是我错过了什么?
  • 尽管如此,ResultatRecherche 仍然是它的超类 NSArray 的一种类型,编译器并不知道它实际包含什么。
  • 您的解决方案确实有效。谢谢,即使我仍然不明白它的逻辑。
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多