我在 xcdatamodel 文件中设置了 CoreData 模型。
我的属性 YYYY 具有可转换类型,并且我在数据模型检查器中设置了转换器名称。
我的情况是我在模型中存储了一个
[CLLocation]
。
class LocationArrayTransformer : NSValueTransformer {
override func transformedValue(value: AnyObject?) -> AnyObject? {
let locations = value as! [CLLocation]
return NSKeyedArchiver.archivedDataWithRootObject(locations)
}
override func reverseTransformedValue(value: AnyObject?) -> AnyObject? {
let data = value as! NSData
return NSKeyedUnarchiver.unarchiveObjectWithData(data)
}
}
这是我的价值转换器。
但不知怎的,我仍然在控制台中收到警告:
No NSValueTransformer with class name XXX was found for attribute YYYY on entity ZZZZ
知道为什么吗?
我花了很多时间来不分享我找到的解决方案:
我必须使
NSValueTransformer
子类可供 Objc 使用。
@objc(LocationArrayTransformer)
class LocationArrayTransformer : NSValueTransformer {
....
}
就这么简单。
正如 @Sbooth 指出的,Swift 类是命名空间的。使用
@objc
使类无需命名空间即可使用。因此将变压器名称设置为 MyApp.Mytransformer
也很好用!
嗯…我现在在 Xcode 15 中收到这个编译警告 - 我不记得以前见过它。它在运行时 100% 正常工作(控制台中没有警告)。