Swift CoreData:无法在 NSManagedObject 上调用指定的初始化程序
Posted
技术标签:
【中文标题】Swift CoreData:无法在 NSManagedObject 上调用指定的初始化程序【英文标题】:Swift CoreData: Failed to call designated initializer on NSManagedObject 【发布时间】:2016-01-10 19:16:45 【问题描述】:我在使用 Core Data 对象获取数据时遇到问题。
这是用于获取数据的代码
let fetchRequest = NSFetchRequest(entityName: "Country")
var countries = [Country!]()
do
countries = try self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [Country!]
catch
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
这是模型定义
import Foundation
import CoreData
@objc(Country)
class Country: NSManagedObject
.....
这是模型的扩展
import Foundation
import CoreData
extension Country
@NSManaged var countryCode: String?
@NSManaged var dialCode: String?
@NSManaged var name: String?
我收到以下错误:
CoreData: error: Failed to call designated initializer on NSManagedObject class 'Country'
fatal error: unexpectedly found nil while unwrapping an Optional value
这条线断了:
countries = try self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [Country!]
我不确定我是否理解这里的问题。有人可以建议吗?
谢谢!
【问题讨论】:
这可能是因为您在某处有一个变量声明,类似于var myObject = Country()
。这不仅声明了变量,它还使用默认初始化程序(init
)创建了一个实例,而 NSManagedObjects(和子类)必须使用指定的初始化程序进行初始化:initWithEntity:insertIntoManagedObjectContext:
。将其声明为 var myObject : Country
【参考方案1】:
把这两行的感叹号分别去掉就行了
var countries = [Country]()
countries = try self.managedObjectContext!.executeFetchRequest(fetchRequest) as! [Country]
NSManagedObject
对象可以用作非可选对象。
隐式展开的可选类型(带感叹号)强制对象调用必须为initWithEntity:insertIntoManagedObjectContext:
的具体初始化程序
【讨论】:
感谢您的回复。但删除这两行的感叹号后,我又得到了同样的错误:CoreData: error: Failed to call designated initializer on NSManagedObject class 'Country' fatal error: unexpectedly found nil while unwrapping an Optional value
你实现Country
中的init()
方法了吗?
不,我应该实现一些特殊的init()
方法吗?或者扩展现有方法initWithEntity
?谢谢!
没有简单的init()
方法,指定的初始化器是强制性的。检查它是否被正确覆盖
我没有重写任何初始化程序,也没有创建简单的init()
。我不明白,我需要创建一些初始化程序吗?谢谢以上是关于Swift CoreData:无法在 NSManagedObject 上调用指定的初始化程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Core Data 中使用 swift 4 Codable?
如何在 Core Data 中使用 swift 4 Codable?
我无法使用非主 MOC 在后台线程上创建 NSManagedObject 的新实例