Core Data : No NSValueTransformer with class name

2020-06-16 03:44发布

问题:

I have my CoreData model set in a xcdatamodel file.

My attribute YYYY has a type transformable and I set the tranformer name in the Data model inspector.

I my case I was storing a [CLLocation] in my model.

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)
    }


}

That's my value transformer.

But somehow I'm still getting the warning in the console : No NSValueTransformer with class name XXX was found for attribute YYYY on entity ZZZZ

Any Idea why ?

回答1:

I spent way to much time on this to not share the solution I found :

I had to make the NSValueTransformer subclass available to Objc.

@objc(LocationArrayTransformer)
class LocationArrayTransformer : NSValueTransformer {
 ....
}

Simple as that.


As @Sbooth points out, Swift classes are namespaced. Using @objc makes the class available without namespacing. So setting the transformer name as MyApp.Mytransformer works well too !