iOS17+Xcode15下Core Data自定义转换器类找不到警告问题
问题描述
已实现自定义NSSecureUnarchiveFromDataTransformer用于Core Data实体属性的转换,代码如下:
@objc(CustomSecureUnarchiveFromDataTransformer) final class CustomSecureUnarchiveFromDataTransformer: NSSecureUnarchiveFromDataTransformer { override class var allowedTopLevelClasses: [AnyClass] { return [NSDateComponents.self] } static let name = NSValueTransformerName(rawValue: String(describing: CustomSecureUnarchiveFromDataTransformer.self)) public static func register() { let transformer = CustomSecureUnarchiveFromDataTransformer() ValueTransformer.setValueTransformer(transformer, forName: name) } }
已将该转换器指定给Core Data实体MyTestObject的testDate属性,且已在应用启动时调用register()方法注册转换器。应用运行正常,但Xcode15仍持续弹出警告:
/Users/..../CoreData:1:1 no NSValueTransformer with class name
'CustomSecureUnarchiveFromDataTransformer' was found for attribute
'testDate' on entity 'MyTestObject'
针对Xcode15/iOS17的解决步骤
优化转换器注册方式:将原注册代码改为使用静态类注册,替换原
register()方法:public static func register() { ValueTransformer.register(CustomSecureUnarchiveFromDataTransformer.self, forName: name) }这种方式更适配Xcode15对值转换器的检查逻辑,确保编译时能识别到转换器类。
提前执行注册逻辑:确保在Core Data栈初始化之前调用转换器的
register()方法。比如在SwiftUI的App结构体初始化中:@main struct YourApp: App { init() { CustomSecureUnarchiveFromDataTransformer.register() } var body: some Scene { WindowGroup { ContentView() } } }或在UIKit的
AppDelegate启动方法中执行注册。验证模型文件中的转换器名称:打开Core Data模型文件,确认实体属性的
Transformer字段完全匹配CustomSecureUnarchiveFromDataTransformer,注意大小写和拼写无错误(Objective-C类名严格区分大小写)。清理Xcode缓存:执行
Cmd+Shift+K清理构建文件夹,随后重启Xcode并重新构建项目,消除缓存导致的旧状态残留。确保类的Objective-C可见性:确认包含转换器类的Swift文件已添加到target的
Compile Sources列表中,且@objc(CustomSecureUnarchiveFromDataTransformer)修饰符未被遗漏,保证类能被Objective-C运行时识别。
内容的提问来源于stack exchange,提问作者Vladimir Amiorkov

