【问题标题】:How can I save variables with value type Measurement<UnitType> using Realm Swift?如何使用 Realm Swift 保存具有值类型 Measurement<UnitType> 的变量?
【发布时间】:2018-11-21 05:42:18
【问题描述】:

Realm Swift 是否支持保存和检索值类型为 Measurement 的数据?这是我要保存的数据的类结构:

class Race: Object {
@objc dynamic var raceDistance: Measurement<UnitLength>?
@objc dynamic var nettTime = Measurement<UnitDuration>?
}

【问题讨论】:

    标签: ios swift properties realm persistence


    【解决方案1】:

    Measurements 本身不受 Realm 支持,但它们符合 Codable,因此您可以保存它们的编码版本:

    @objc dynamic var encodedRaceDistance: Data?
    // Realm 10.10+
    // @Persisted var encodedRaceDistance: Data?
    

    您可以添加这样的计算属性以从数据中获取Measurement&lt;UnitLength&gt;:

    var raceDistanceMeasurement: Measurement<UnitLength>? {
        get {
            if let encoded = encodedRaceDistance {
                return try? JSONDecoder().decode(Measurement<UnitLength>.self, from: encoded)
            }
            return nil
        }
        
        set {
            if let newValue = newValue {
                encodedRaceDistance = try? JSONEncoder().encode(newValue)
            } else {
                encodedRaceDistance = nil
            }
        }
    }
    

    【讨论】:

    • 像这样恢复 UnitLength 并不像我预期的那样工作。尝试转换它返回 0。我错过了什么吗? var test = Measurement(value: 23, unit: UnitLength(symbol: "mm")) test.convert(to: UnitLength(symbol: "cm")) 看来我可以为符号输入任何字符串。
    • 另一方面,这按预期工作...var test = Measurement(value: 23, unit: UnitLength.millimeters) test.convert(to: UnitLength.centimeters)
    • @Mathieson 嗯,我 3 年前显然不知道很多:D Measurement 符合 Codable,所以存储 Data 然后用 JSONDecoder 编码和解码应该可以吗?
    • 啊!这是个好主意。我可能不再需要坚持 Unit 的类型,但如果我发现需要再次坚持,我会进一步深入研究这个想法!
    • 我还没有需要回到这一点,但我需要重新创建一个测量是为了 CoreData 而不是 Realm。在研究其他 CoreData 的东西时,我刚刚看到了这篇文章,这似乎非常相关:avanderlee.com/swift/valuetransformer-core-data/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多