无法实例化 NSManagedObject 的子类

Posted

技术标签:

【中文标题】无法实例化 NSManagedObject 的子类【英文标题】:Can't instantiate subclass of NSManagedObject 【发布时间】:2014-10-28 01:36:04 【问题描述】:

Xcode 6 存在大量错误。但我不太确定这是否是一个错误。可能不是,因为这是我刚刚学习的东西。

我的问题是,每当我尝试实例化我的 NSManagedObject 的子类时,我都无法将 entity: NSEntityDescriptionNSManagedContext: insertIntoManagedContext 参数传递给构造函数,Xcode 说“调用中的额外参数'实体'”

我从头开始创建了一个新的 Xcode 项目,只是想看看我是否可以在一个更小、最小的项目中重新创建问题。

ToDoList.Item 在数据模型检查器中设置为Item 实体类。

代码如下:

override func viewDidLoad() 

    super.viewDidLoad()

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext!

    let ent = NSEntityDescription.entityForName("Item", inManagedObjectContext: context)!

    //compiler complains here
    var item = Item(entity: ent, insertIntoManagedObjectContext: context)!


这是子类:

import UIKit
import CoreData

class Item: NSManagedObject 

    @NSManaged var title: String
    @NSManaged var completed: Bool


感谢所有帮助。

【问题讨论】:

【参考方案1】:

刚遇到同样的问题:Init method for core data entity not available

显然我们必须实现

init(entity: NSEntityDescription, insertIntoManagedObjectContext context, NSManagedObjectContext?)

我们自定义的 NSManagedObject 类中的方法。所以只需添加

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 
    super.init(entity: entity, insertIntoManagedObjectContext: context)

到你的实体类,它会工作。

【讨论】:

这在 SDK 的最新版本中必须是必需的。我在 youtube 上看到 M2KDev 没有它就可以做到这一点。【参考方案2】:

试试不带感叹号的最后一行,像这样:

var item = Item(entity: ent, insertIntoManagedObjectContext: context)

也许你还没有将你的应用名称添加到类名中:

Swift 类是命名空间的——它们的作用域是编译它们的模块(通常是项目)。要将 NSManagedObject 类的 Swift 子类与您的 Core Data 模型一起使用,请在具有模块名称的模型实体检查器。

https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html

【讨论】:

我确实在上面说过...“ToDoList.Item 在数据模型检查器中设置为项目实体类。” ToDoList 是项目名称。删除感叹号会引发错误。不过,感谢您的意见【参考方案3】:

构造函数在 Swift 中是继承的吗?

我会尝试使用NSEntityDescription.insertNewObjectForEntityForName:inManagedObjectContext

【讨论】:

看起来这需要我解决。但我已经看到它是通过子类完成的。

以上是关于无法实例化 NSManagedObject 的子类的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 子类之间看似不一致的行为

子类化一个 NSManagedObject 子类

将方法添加到从 NSManagedObject 子类化的类

NSLog'd 时子类化的 NSManagedObject 不调用描述

如何在 swift 中将子类 NSManagedObject 分配给 var(而不是常量)

将资源注入 NSManagedObject 子类实例