cocoa - Swift 和 Core Data 错误 : fatal error: use of unimplemented initializer 'init(entity:insertIntoManagedObjectContext:)'

标签 cocoa core-data swift initialization

我有以下继承自 NSManagedObject 的类:

import Foundation
import CoreData


class Note: NSManagedObject {



    @NSManaged var text: String
    @NSManaged var name: String


     init(name: String, text:String, context: NSManagedObjectContext){

        let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: context);
        super.init(entity: entity!, insertIntoManagedObjectContext: context)

        self.text = text
        self.name = name;

    }
}

当我创建它的实例时,一切正常,但是当我搜索这些实体时,我得到一个非常奇怪的错误:

fatal error: use of unimplemented initializer 'init(entity:insertIntoManagedObjectContext:)'

这是导致错误的代码:

func coreDatePlayground(){

    var note = Note(name: "A new note", text: "blah", context: self.managedObjectContext!)

    println("\(note.name)  \(note.text)")

    var noote2 = Note(name: "Another note", text: "blah blah", context: self.managedObjectContext!)


    managedObjectContext?.save(nil)

    var fetch = NSFetchRequest(entityName: "Note")
    // This line causes the crash.
    var results = self.managedObjectContext?.executeFetchRequest(fetch, error: nil)
    if let objects = results{
        println(objects.count)
    }

}

我发现更改初始化程序,使其成为一个方便的初始化程序并调用 self 而不是 super 可以解决这个问题,但我不知道为什么。

 convenience init(name: String, text:String, context: NSManagedObjectContext){

    let entity = NSEntityDescription.entityForName("Note", inManagedObjectContext: context);
    self.init(entity: entity!, insertIntoManagedObjectContext: context)

    self.text = text
    self.name = name;

}

上面的代码有效,但我不知道为什么。有人知道发生了什么事吗?是错误还是我的错?

最佳答案

这是 documented行为。

Swift subclasses do not inherit their superclass initializers by default

例如,以下代码甚至无法编译,因为 Child 不会自动继承 init(id:String)。此机制确保 Child 类中的 name 正确初始化。

class Parent {
    var id:String
    init(id:String) {
        self.id = id
    }
}

class Child:Parent {
    var name:String
    init(id:String, name:String) {
        self.name = name
        super.init(id: id)
    }
}

var child1 = Child(id:"child1")

如果您在子类中只定义了convenience 构造器,那么它会自动继承其父类(super class)指定的所有构造器,如“自动构造器继承”部分所述

关于cocoa - Swift 和 Core Data 错误 : fatal error: use of unimplemented initializer 'init(entity:insertIntoManagedObjectContext:)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26202346/

相关文章:

objective-c - 使用 Foundation 的 Objective-C 中的命令行工具?

ios - 如何将 OCMock 对象与调用 isKindOfClass 的代码一起使用?

xcode - 未经修改的 SwiftUI/Core Data 默认应用程序代码无法在模拟器中运行?

objective-c - 如何让 NSSearchField 在自动完成时发送操作?

ios - 使用核心数据变量指定字体大小

ios - 在 iOS UserDefaults 中存储字典

json - 使用分隔符 ", "连接字符串数组并添加 ", and "以连接 Swift 中的最后一个元素

ios - 如何让 Xcode 调试器再次显示 'self' 和变量值?

快速生成二维码

objective-c - 在其父 View 中定位元素