Объявите доступное только для чтения свойство @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, свойство только для чтения.

Другие вопросы по тегам