Unable to initialize `ValueTransformer` for UIImageTransformer

I generated model classes using XCode's auto-generate functionality while trying to migrate from CoreData to SwiftData.

I get a fatal error on launch - Thread 1: Fatal error: Unable to initialize ValueTransformer for UIImageTransformer

Any suggestions are welcome!

Please find the code below:

import SwiftData
import UIKit


@Model public class ******** {
    public var id: UUID = UUID()
    var idDrink: String = ""
    @Attribute(.transformable(by: UIImageTransformer.self)) var image: UIImage?
    var isFavourite: Bool = false
    var order: Int16 = 0
    var strAlcoholic: String = ""
    var strCategory: String = ""
    @Attribute(.unique) var strDrink: String = ""
    var strDrinkThumb: String = ""
    var strGlass: String = ""
    var strImageSource: String = ""
    var strInstructions: String = ""
    @Relationship(inverse: \Component.********) var ingredient: [Component] = []

    public init() { }
}

import Foundation
import SwiftData


@Model public class Component {
    var measure: String?
    var name: String?
    var ********: ********?

    public init() { }
    
}

Value transformer:

import UIKit


class UIImageTransformer: ValueTransformer {
    
    static let name = NSValueTransformerName(rawValue: "UIImageTransformer")
    
    override func transformedValue(_ value: Any?) -> Any? {
        guard let image = value as? UIImage else { return nil }
        
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: image, requiringSecureCoding: true)
            
            return data
        } catch {

            return nil
        }
    }
    
    override func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let data = value as? Data else { return nil }
        
        do {
            let image = try NSKeyedUnarchiver.unarchivedObject(ofClass: UIImage.self, from: data)
            
            return image
        } catch {

            return nil
        }
    }
    
    override public class func transformedValueClass() -> AnyClass {
        return UIImage.self
    }
    
    override public class func allowsReverseTransformation() -> Bool {
        return true
    }
    
    static func register() {
        ValueTransformer.setValueTransformer(UIImageTransformer(), forName: name)
    }
}

App:

import SwiftUI

@main
struct CocktailsSwiftUIApp: App {
    
    // MARK: Body
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: [********.self, Component.self])
    }
}
Answered by vriu in 768102022

This works:

// MARK: Body
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: modelTypes())
    }
    
    
    // MARK: Private methods
    
    private func modelTypes() -> [any PersistentModel.Type] {
        UIImageTransformer.register()
        
        return [********.self, Component.self]
    }
Accepted Answer

This works:

// MARK: Body
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .modelContainer(for: modelTypes())
    }
    
    
    // MARK: Private methods
    
    private func modelTypes() -> [any PersistentModel.Type] {
        UIImageTransformer.register()
        
        return [********.self, Component.self]
    }
Unable to initialize `ValueTransformer` for UIImageTransformer
 
 
Q