【问题标题】:Declare a read-only @NSManaged property in Swift for Parse's PFRelation在 Swift 中为 Parse 的 PFRelation 声明一个只读的 @NSManaged 属性
【发布时间】:2015-11-09 13:12:48
【问题描述】:

我在我的 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 2.0 特有的问题,但我现在无法确认。我会更新问题。
  • 我的意思是,我在使用 Swift 2.0 的 Xcode7 beta 5 的解析项目中没有这个警告

标签: ios swift core-data parse-platform pfrelation


【解决方案1】:

以下是使用 Swift 创建只读 Core Data 属性的方法。我不知道这是否是 Parse 正在寻找的,但这就是在 Swift 中的工作方式。

虽然 Xcode 在属性上生成 NSManagedObject 子类和 @NSManaged,但它实际上并不是必需的。可以将 @NSManaged 属性替换为等效的 Swift 计算属性,这些属性使用 Core Data 原始访问器来获取/设置属性值。您可以通过不包含 setter 将属性有效地设为只读。

这意味着将您现有的 relatedThings 声明替换为以下内容:

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

        return things
    }
}

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

【讨论】:

  • 我意识到你可以只用一个 get 来定义一个计算的 var。我的问题是关于将 var 定义为仅获取而不添加所有这些看似不必要的代码。
  • 如果您使用的是 Swift 和 Core Data,则不会。
【解决方案2】:

Tom's answer 对我不起作用,因为PFObject 不是NSManagedObject 的子类,因此它没有实现willAccessValueForKeyprimitiveValueForKeydidAccessValueForKey 方法。

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

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

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

【讨论】:

  • 查看 iGenio 的答案以获得正确答案,此答案在尝试对 PFRelation 执行任何操作时导致错误。
【解决方案3】:

现在你应该使用:

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

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2015-11-21
    • 2018-12-26
    • 1970-01-01
    • 2014-11-20
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多