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