Объявить свойство @NSManaged только для чтения в Swift для PFRelation синтаксического анализа


Я использую Parse object store в своем приложении 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

Так как разобрать ожидать меня, чтобы объявить свойство отношения?

3 9

3 ответа:

Теперь вы должны использовать:

var relatedThings: PFRelation! {
    return relationForKey("relatedThings")
}

Ответ Тома не сработал для меня, так как PFObject не является подклассом NSManagedObject, поэтому он не реализуетwillAccessValueForKey, primitiveValueForKey, и методы didAccessValueForKey.

Однако использование собственного метода PFObject objectForKey является правильным эквивалентным решением:

var relatedThings: PFRelation! {
    return objectForKey("relatedThings") as? PFRelation
}

Вам все равно нужно либо принудительно привести значение, которое метод возвращает в PFRelation, либо, согласно версии Тома, превратить тип свойства в необязательный.

Вот как вы можете создать свойство основных данных только для чтения с помощью Swift. Я не знаю, является ли это тем, что ищет Parse, но это то, как все будет работать в Swift.

Хотя Xcode генерирует подклассы NSManagedObject с атрибутами @NSManaged, на самом деле это не требуется. Можно заменить атрибуты @NSManaged эквивалентными вычисляемыми свойствами Swift, которые используют основные методы доступа примитивов данных для получения / задания значений свойств. Вы бы сделали свойство эффективно только для чтения, не включая a сеттер.

Это означало бы заменить ваше существующее объявление relatedThings чем-то вроде этого:

var relatedThings : PFRelation? {
    get {
        self.willAccessValueForKey("relatedThings")
        let things = self.primitiveValueForKey("relatedThings") as? PFRelation
        self.didAccessValueForKey("relatedThings")

        return things
    }
}

Этот код get будет работать так же, как если бы вы использовали @NSManaged. Но, не имея set, свойство доступно только для чтения.