在 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
的子类,因此它没有实现 willAccessValueForKey
、primitiveValueForKey
,以及 didAccessValueForKey
方法。
然而,使用PFObject
自己的objectForKey
方法是正确的等效解决方案:
var relatedThings: PFRelation! {
return objectForKey("relatedThings") as? PFRelation
}
您仍然需要将方法 returns 的值强制转换为 PFRelation
,或者按照 Tom 的版本,将 属性 的类型转换为可选类型。
现在你应该使用:
var relatedThings: PFRelation! {
return relationForKey("relatedThings")
}
我在我的 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
的子类,因此它没有实现 willAccessValueForKey
、primitiveValueForKey
,以及 didAccessValueForKey
方法。
然而,使用PFObject
自己的objectForKey
方法是正确的等效解决方案:
var relatedThings: PFRelation! {
return objectForKey("relatedThings") as? PFRelation
}
您仍然需要将方法 returns 的值强制转换为 PFRelation
,或者按照 Tom 的版本,将 属性 的类型转换为可选类型。
现在你应该使用:
var relatedThings: PFRelation! {
return relationForKey("relatedThings")
}