Объявите доступное только для чтения свойство @NSManaged в Swift для PFRelation Parse
Я использую хранилище объектов Parse в своем приложении iOS и создал собственный подкласс для моего объекта Parse, который выглядит примерно так:
class MyThing: PFObject, PFSubclassing {
// ...PFSubclassing protocol...
@NSManaged var name: String
@NSManaged var somethingElse: String
@NSManaged var relatedThings: PFRelation
}
relatedThings
свойство работает: я могу получить связанные объекты из магазина. Тем не менее, я продолжаю получать это предупреждение от Parse:
[Warning]: PFRelation properties are always readonly,
but MyApp.MyThing.relatedThings was declared otherwise.
В Objective-C я мог бы легко пометить это свойство как предназначенное только для чтения, но я не уверен, как это сделать в Swift, чтобы отключить предупреждение.
С помощью let
вместо var
не допускается в сочетании с @NSManaged
,
Добавление private(set)
также не имеет никакого эффекта:
@NSManaged private(set) var relatedThings: PFRelation
Так как же Parse ожидает, что я объявлю свойство отношений?
3 ответа
Теперь вы должны использовать:
var relatedThings: PFRelation! {
return relationForKey("relatedThings")
}
Ответ Тома у меня не сработал, так как PFObject
не подкласс NSManagedObject
таким образом, он не реализует willAccessValueForKey
, primitiveValueForKey
, а также didAccessValueForKey
методы.
Однако, используя PFObject
собственный objectForKey
Метод является правильным эквивалентным решением:
var relatedThings: PFRelation! {
return objectForKey("relatedThings") as? PFRelation
}
Вам все еще нужно принудительно привести значение, к которому возвращается метод PFRelation
или, согласно версии Тома, превратить тип свойства в необязательный.
Вот как можно создать свойство Core Data только для чтения с помощью Swift. Я не знаю, ищет ли это Parse, но так будет работать в Swift.
Хотя Xcode генерирует NSManagedObject
подклассы с @NSManaged
на атрибуты, это на самом деле не требуется. Нормально заменить @NSManaged
атрибуты с эквивалентными вычисленными свойствами Swift, которые используют примитивы Core Data для получения / установки значений свойств. Вы сделаете свойство эффективно только для чтения, не включая установщик.
Это будет означать замену вашего существующего relatedThings
объявление с чем-то вроде этого:
var relatedThings : PFRelation? {
get {
self.willAccessValueForKey("relatedThings")
let things = self.primitiveValueForKey("relatedThings") as? PFRelation
self.didAccessValueForKey("relatedThings")
return things
}
}
это get
код будет работать так же, как если бы вы использовали @NSManaged
, Но не имея set
, свойство только для чтения.