在 Swift 中为 Parse 的 PFRelation 声明一个只读的@NSManaged 属性

Declare a read-only @NSManaged property in Swift for Parse's PFRelation

我在我的 iOS 应用程序中使用 Parse object store 并且我为我的 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 希望我如何声明关系 属性?

以下是使用 Swift 制作只读核心数据 属性 的方法。我不知道这是否是 Parse 正在寻找的,但这就是 Swift.

中的工作方式

虽然 Xcode 生成 NSManagedObject 个子类,在属性上带有 @NSManaged,但实际上并不是必需的。可以将 @NSManaged 属性替换为等效的 Swift 计算属性,这些属性使用核心数据原语访问器访问 get/set 属性 值。您可以通过不包含 setter.

使 属性 有效地 只读

这意味着用这样的东西替换现有的 relatedThings 声明:

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

        return things
    }
}

get 代码的工作方式与您使用 @NSManaged 时相同。但是由于没有 set,属性 是只读的。

对我不起作用,因为 PFObject 不是 NSManagedObject 的子类,因此它没有实现 willAccessValueForKeyprimitiveValueForKey,以及 didAccessValueForKey 方法。

然而,使用PFObject自己的objectForKey方法是正确的等效解决方案:

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

您仍然需要将方法 returns 的值强制转换为 PFRelation,或者按照 Tom 的版本,将 属性 的类型转换为可选类型。

现在你应该使用:

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