[英]Can not add class with generic type to swift realm
我需要在领域中保存一个类,该类包含以下通用类型:-
@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
dynamic var key: String?
dynamic var type: T?
override class func primaryKey() -> String {
return "key"
}
}
@objcMembers
class ClassB: Object, Codable {
}
let object: ClassA<ClassB>
realm.add(object, update: true)
但是不幸的是,此代码仅将ClassA.key保存在领域中并忽略了ClassA.type。
我已经用谷歌搜索了这个问题,但不幸的是没有任何结果。 似乎没有人在领域类中使用泛型类型。
终于我找到了正确的解决方案。 我利用了通用领域列表类型的优势,然后将“ type”变量修改为通用列表而不是单个通用对象的列表。 现在,我可以正常使用。 现在,我可以轻松地在类中使用泛型类型并将该类保存到领域,而不会出现任何问题。
@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
dynamic var key: String?
var type: List<T>()
override class func primaryKey() -> String {
return "key"
}
}
@objcMembers
class ClassB: Object, Codable {
}
let object: ClassA<ClassB>
realm.add(object, update: true)
@objcMembers
仅将兼容成员公开给Objective-C。 Swift泛型不包含在其中,因为它们与Objective-C不兼容。 Realm的工作原理是将成员暴露于Objective-C。
可能的解决方案:
@objcMembers
class ClassA<T: Object & Codable>: Object, Codable {
dynamic var key: String?
var type: T?
override class func primaryKey() -> String {
return "key"
}
}
@objcMembers
class ClassB: Object, Codable {
}
class ClassABComposite: ClassA<ClassB> {
// T can be realized as ClassB here
override var type: ClassB? {
set {
backingType = newValue
}
get {
return backingType
}
}
// This will work because it's not generic
@objc dynamic var backingType: ClassB?
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.