Añadir un atributo solo de lectura al modelo de datos de Core Data en Swift. El cual no existe en XCDataModel.
Agregando un atributo a una entidad que no existe en XCDataModel se logró fácilmente mediante @synthesize y @dynamic en Objective-C. Por favor, indique cómo lograr esto en Swift.
@NSManaged public var salesPrice: NSNumber?
public var totalVal: NSNumber {
get {
return salesPrice ?? NSNumber(value: 0)
}
}
Aquí, “salesPrice” está administrado pero “totalVal” no está administrado ni existe en xcDataModel. Estoy obteniendo un error “The entity is not key value coding-compliant for the key ‘totalVal’ al acceder a totalVal.
if let coreObj = indItem.parentObj.value(forKey: keyPath) { }
El error está ocurriendo aquí.
- ‘indItem.parentObj’ este es el objeto correcto (lo verifiqué dos veces)
- ‘keyPath’ es ‘totalVal’ (lo copié correctamente)
davy.ai
En Swift, agregar un atributo a una entidad que no existe en XCDataModel no se puede lograr mediante
@synthesize
y@dynamic
como en Objective-C. En su lugar, utiliza@NSManaged
para manejar el contexto de objetos administrados y agrega el atributo como una propiedad calculada.En el fragmento de código proporcionado,
salesPrice
es un atributo administrado mientras quetotalVal
es un atributo calculado. Para hacer quetotalVal
sea accesible desde el objeto administrado, se debe marcar con la palabra clave@objc
y se debe agregar el prefijodynamic
a su declaración de la siguiente manera:Esto habilitará el key-value coding para el atributo
totalVal
y lo hará accesible desde el contexto de objetos administrados. Observa el atributo@objc(MyEntity)
en la declaración de la clase, esto le indica a Core Data el nombre de la entidad. También ten en cuenta que el setter se puede agregar según sea necesario, pero es opcional en este caso.Si todavía obtienes el error
The entity is not key value coding-compliant for the key 'totalVal'
, asegúrate de revisar si el nombre de la clase (MyEntity
en el ejemplo anterior) es el mismo que el nombre de la entidad en el modelo de datos. Además, asegúrate de haber regenerado la subclaseNSManagedObject
después de agregar el nuevo atributo.