What is going on with transformable

This thread has been locked by a moderator; it no longer accepts new replies.

Hi, I keep trying to use transformable to store an array of strings with SwiftData, and I can see that it is activating the transformer, but it keeps saying that I am still using NSArray instead of NSData. *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "category"; desired type = NSData; given type = Swift.__SwiftDeferredNSArray; value = ( yo, gurt ).' terminating due to uncaught exception of type NSException CoreSimulator 1010.10 - Device: iPhone 16 18.0 (6879535B-3174-4025-AD37-ED06E60291AD) - Runtime: iOS 18.0 (22A3351) - DeviceType: iPhone 16 Message from debugger: killed

@Model
    class MyModel: Identifiable, Equatable {
        
        @Attribute(.transformable(by: StringArrayTransformer.self)) var category: [String]?
        
        @Attribute(.transformable(by: StringArrayTransformer.self)) var amenities: [String]?
        
        var image: String?
        
        var parentChunck: MyModelDataChunk_V1?
        
        init(category: [String]?, amenities: [String]?) {
            self.category = category
            self.amenities = amenities
        }
    }
class StringArrayTransformer: ValueTransformer {
    override func transformedValue(_ value: Any?) -> Any? {
        print(value)
        guard let array = value as? [String] else { return nil }
        let data = try? JSONSerialization.data(withJSONObject: array, options: [])
        print(data)
        return data
    }
    
    override func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let data = value as? Data else { return nil }
        let string = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [String]
        print(string)
        return string
    }
    
    override class func transformedValueClass() -> AnyClass {
        return NSData.self
    }
    
    override class func allowsReverseTransformation() -> Bool {
        return true
    }
    
    static func register() {
        print("regitsering")
        ValueTransformer.setValueTransformer(StringArrayTransformer(), forName: .stringArrayTransformerName)
    }
}
 
extension NSValueTransformerName {
    static let stringArrayTransformerName = NSValueTransformerName("StringArrayTransformer")
}
Answered by DTS Engineer in 847124022

Let’s focus this discussion on your other thread.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Boost

Let’s focus this discussion on your other thread.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

What is going on with transformable
 
 
Q