我有一个类,它包含保存在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。我试过看泛型,但我还不明白这个话题。
答案 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
}