小编Ste*_*ord的帖子

在 Core Data 中创建计算属性

我有一个连接到 Storyboard GUI 的核心数据模型。(Xcode 9 和 SWIFT 4)我现在想添加一个源自其他两个属性的属性。我有一个名为 Workout 的实体,它的两个属性“rpe”和“秒”组合起来创建一个新属性“rpeTSS”。我已将“repTSS”声明为我的核心数据模型中的属性。我把它设置为瞬态。

我尝试使用编辑器菜单下的“make NSManagedObject subclass...”选项,但这似乎会生成有错误的文件。我尝试对生成的 Workout 类进行子类化,但不知道如何将其绑定到 GUI。

然后我对 Workout 进行了扩展:

extension Workout{

    public override func value(forKey key: String) -> Any? {
        if key == "rpeTSS"{
            return (100/49)*rpe*rpe*Double(seconds)/3600
        }else{return super.value(forKey: key)}
    }
}
Run Code Online (Sandbox Code Playgroud)

老实说,这“感觉”不对。无论如何,它(有点)有效。我现在得到了 rpeTSS 的正确值,它显示在我的 GUI 中。但是,如果我对 rpe 和/或秒进行更改,GUI 不会更新。

我猜上面的方法有点破解,因此绕过了更新 GUI 的各种消息传递。

在核心数据中添加派生属性的正确方法是什么?我试图以一种方式实现这一点,这意味着如果我向数据模型添加任何内容,我不必重新编写派生属性的代码。

xcode core-data swift

6
推荐指数
1
解决办法
4249
查看次数

基于核心数据中基础实体属性的计算属性

我有一个核心数据模型,其实体 \xe2\x80\x9cDay\xe2\x80\x9d 包含零个或多个 \xe2\x80\x9cWorkout\xe2\x80\x9ds。日实体具有许多属性,这些属性是通过对所有锻炼进行求和来计算的。例如,totalKM 将所有锻炼的 km 属性值相加。

\n\n

我只能 \xe2\x80\x99t 让它工作。

\n\n

我可以通过重写 value(forKey) 方法来显示总计:

\n\n
public override func value(forKey key: String) -> Any? {\n    if(key == "swimSeconds"){\n        var swimSeconds: Int64 = 0\n        if let array = workouts?.allObjects{\n            for w in array{\n                let workout: Workout = w as! Workout\n                if (workout.sport == Workout.SPORT.Swim.rawValue){\n                    swimSeconds += workout.seconds\n                }\n            }\n        }\n        return swimSeconds\n    }else{\n        return super.value(forKey: key)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这意味着如果基础锻炼发生变化,这不会反映在“日”实体中显示的总计值中。而且感觉这不是正确的做法 - 我不应该\xe2\x80\x99t需要覆盖这个方法。

\n\n

我\xe2\x80\x99ve尝试使用Xcode创建NSManagedObject子类,但这创建了一个包含所有@NSManaged变量的扩展,但这只会给出大量错误\xe2\x80\x9cExtensions可能不包含存储的属性\xe2\x80\x9d仅通过删除@NSManaged 来修复。

\n\n

我尝试创建自己的 Extension to Day 并拥有一个只有 getter …

core-data swift

2
推荐指数
1
解决办法
1940
查看次数

标签 统计

core-data ×2

swift ×2

xcode ×1