减少代码重复以更新领域中的值

时间:2018-03-18 14:58:55

标签: swift realm

我有一个类,它包含保存在Realm中的不同类的版本。这是班级:

class Versions: Object{
    @objc dynamic var versionY = 0
    @objc dynamic var versionX = 0
}

现在,versionY和versionX都有自己独立的类。他们可以使用以下方法更新类Version中的版本。 (给出类版本Y的示例):

class VersionY: Object{
    func updateStoredVersion(versions: Versions) -> Bool {
        do{
            try LocalFilesManager.realm.write {
                versions.storedVersion.versionY = versions.newestVersion.versionY
            }
            return true
        }catch{
            return false
        }
    }
}

现在我在Versions中有很多不同的类,我想知道我是否可以只用一种方法更新版本以防止代码重复。我使用上面的方法对类VersionX(以及其他所有类)只是为了更新Realm中的值。我不知道如何完成代码重复,因为Swift使用pass by value。我试过看泛型,但我还不明白这个话题。

1 个答案:

答案 0 :(得分:0)

如果您使用 Swift 4 ,则可以使用键路径访问或设置对象的属性。如果您为存储版本的每个类继承了以下协议,则可以指定存储该类版本的keypath。

protocol VersionedObject {
    static var versionKeyPath: ReferenceWritableKeyPath<Versions, Int> { get }

    func updateStoredVersion(versions: Versions, newVersion: Int) -> Bool
}

extension VersionedObject {
    func updateStoredVersion(versions: Versions, newVersion: Int) -> Bool {
        do {
            try LocalFilesManager.realm.write {
                versions[keyPath: Self.versionKeyPath] = newVersion
            }
            return true
        } catch {
            return false
        }
    }
}

示例类X应该在Versions.versionX中存储它的版本,如下所示:

class X: VersionedObject {
    static var versionKeyPath: ReferenceWritableKeyPath<Versions, Int> = \.versionX

    // Rest of your code
}