Xcode 13中NSManagedObject关联类型无fetchRequest成员编译报错问题
问题产生原因
NSManagedObject基类本身并未定义fetchRequest()类方法,该方法是Xcode编译时为每个Core Data模型对应的NSManagedObject子类自动生成的方法,仅归属具体子类所有,没有在基类或公共协议中做通用声明。- Xcode 13 搭载的Swift 5.5版本收紧了泛型上下文的类型检查规则,不再兼容旧版编译器对自动生成方法的隐式推断逻辑,因此在关联类型的泛型场景下,编译器无法确认
FetchableObject一定存在该方法,直接抛出编译错误。
可行解决方法
方法1:新增协议约束关联类型的能力(最推荐)
定义公共协议声明fetchRequest()方法,让所有NSManagedObject子类默认遵循该协议,从类型层面保证方法存在:
// 新增协议声明 protocol CoreDataFetchRequestProviding: NSManagedObject { static func fetchRequest() -> NSFetchRequest<Self> } // 修改原协议的关联类型约束 public protocol CoreDataFetchable { associatedtype FetchableObject: CoreDataFetchRequestProviding // 剩余原有代码不变 }
所有Xcode自动生成的NSManagedObject子类本身已经实现了fetchRequest()方法,无需额外写实现代码,自动满足协议要求。
方法2:显式初始化NSFetchRequest(兼容性最强)
不依赖Xcode自动生成的fetchRequest()方法,直接手动初始化请求,完全规避版本差异问题,把原有报错行替换为以下代码即可:
let fetchRequest = NSFetchRequest<FetchableObject>(entityName: String(describing: FetchableObject.self))
方法3:显式标注变量类型(适用临时兼容场景)
如果不想修改原有协议结构,可以给变量加上显式的类型标注,引导编译器识别自动生成的方法:
let fetchRequest: NSFetchRequest<FetchableObject> = FetchableObject.fetchRequest()
注意:该方法依赖Xcode的自动生成代码规则,若后续Core Data代码生成规则调整可能再次出现兼容问题
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

