上下文
我正在使用Xcode 12在macOS Catalina(10.15.6)上构建应用程序。该应用程序使用Core Data。我已经让Xcode使用Swift生成我的NSManagedObject实体的子类。看起来像这样:
// LPProject+CoreDataClass.swift
import Foundation
import CoreData
@objc(LPProject)
public class LPProject: NSManagedObject
{
@objc func printStuff() {
NSLog("This is a function to test the situation.")
}
}
以及另一个自动生成的文件:
// LPProject+CoreDataProperties.swift
import Foundation
import CoreData
extension LPProject {
@nonobjc public class func fetchRequest() -> NSFetchRequest<LPProject> {
return NSFetchRequest<LPProject>(entityName: "LPProject")
}
}
我已省略了实体的属性,因为它们与问题无关。
问题
我的应用程序的一部分仍然是Objective-C。在那部分中,我创建一个LPProject
实体并尝试调用printStuff()
:
// Assume 'moc' is an NSmanagedobjectcontext defined elsewhere.
LPProject *project = [NSEntityDescription insertNewObjectForEntityForName:@"LPProject" inmanagedobjectcontext:moc];
[project printsomeStuff];
在macOS 10.14和10.15上,它可以完美运行。在macOS 10.13和更低版本上,它会导致“无法识别的选择器”崩溃:
-[NSManagedObject printStuff]: unrecognized selector sent to instance 0x01038202384929
之所以会这样,是因为模块名称位于类名称的前面。我看到以下日志消息:
warning: Unable to load class named 'MyApp.LPProject' for entity 'LPProject'.
Class not found,using default NSManagedObject instead.
根据我发现的所有内容,该实体已在Core Data编辑器中正确配置为与@objc()
声明一起使用:
那么...我想念什么?为什么模块名称在10.13之前而不是在10.14和10.15之前放在类名之前?