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