ios - docs - Declarar una propiedad @NSManaged de solo lectura en Swift para la relación PF de Parse
programar en ios desde windows (3)
Estoy usando la tienda de objetos Parse en mi aplicación iOS y he creado una subclase personalizada para mi objeto Parse, que se parece a esto:
class MyThing: PFObject, PFSubclassing {
// ...PFSubclassing protocol...
@NSManaged var name: String
@NSManaged var somethingElse: String
@NSManaged var relatedThings: PFRelation
}
La propiedad relatedThings
funciona: puedo buscar los objetos relacionados desde la tienda. Sin embargo, sigo recibiendo esta advertencia de Parse:
[Warning]: PFRelation properties are always readonly,
but MyApp.MyThing.relatedThings was declared otherwise.
En Objective-C, podría haber marcado fácilmente esa propiedad como de solo lectura, pero no estoy seguro de cómo hacer eso en Swift para silenciar la advertencia.
No se let
uso de let
lugar de var
en combinación con @NSManaged
.
Agregar private(set)
tampoco tiene efecto:
@NSManaged private(set) var relatedThings: PFRelation
Entonces, ¿cómo espera Parse que declare la propiedad de la relación?
A continuación, le mostramos cómo crearía una propiedad de Datos básicos de solo lectura con Swift. No sé si esto es lo que Parse está buscando, pero es cómo funcionarían las cosas en Swift.
Aunque Xcode genera subclases NSManagedObject
con @NSManaged
en los atributos, en realidad no es necesario. Está bien reemplazar los atributos @NSManaged
con propiedades equivalentes calculadas de Swift que usan @NSManaged
primitivos de Core Data para obtener / establecer valores de propiedad. Haría que la propiedad fuera efectivamente de solo lectura al no incluir un colocador.
Eso significaría reemplazar su declaración existente relacionada con relatedThings
por algo como esto:
var relatedThings : PFRelation? {
get {
self.willAccessValueForKey("relatedThings")
let things = self.primitiveValueForKey("relatedThings") as? PFRelation
self.didAccessValueForKey("relatedThings")
return things
}
}
Este código de get
funcionará igual que si estuvieras usando @NSManaged
. Pero al no tener un set
, la propiedad es de solo lectura.
Ahora deberías usar:
var relatedThings: PFRelation! {
return relationForKey("relatedThings")
}
La respuesta de Tom no funcionó para mí, ya que PFObject
no es una subclase de NSManagedObject
, por lo que no implementa los willAccessValueForKey
, primitiveValueForKey
y didAccessValueForKey
.
Sin embargo, usar el propio método objectForKey
es la solución equivalente correcta:
var relatedThings: PFRelation! {
return objectForKey("relatedThings") as? PFRelation
}
Aún necesita forzar la PFRelation
del valor que el método devuelve a PFRelation
o, según la versión de Tom, convertir el tipo de propiedad en un opcional.