所以我正在尝试创建一个可重用的函数,我传递了对象(我有3个Object类),但是当我尝试下面的代码时,代码对我来说value of type object has no member id
。它在代码行显示:arrayFromDB.append(items.id)
这很奇怪,因为我的所有3个对象都包含id
func deleteUnwanted (fromJSON:[Int], db: Object.Type) {
var arrayFromDB:[Int] = [Int]()
let realm = try! Realm()
let getFromDB = realm.objects(db)
for items in getFromDB {
arrayFromDB.append(items.id)
}
... other stuff
调用函数本身(不会出错)
self.deleteUnwanted(self.catstringJson,db: LocalDataFolders.self)
对象类
class LocalDataF: Object {
dynamic var id:Int = 0
...
override static func primaryKey() -> String? {
return "id"
}
}
class LocalDataC: Object {
dynamic var id:Int = 0
...
override static func primaryKey() -> String? {
return "id"
}
}
class LocalDataA: Object {
dynamic var id:Int = 0
...
override static func primaryKey() -> String? {
return "id"
}
}
答案 0 :(得分:1)
Realm DB与您的问题无关。
斯威夫特不是一种鸭子式的语言。您确实知道所有对象都有id
个字段,但您还必须找到一种方法来说服编译器。
protocol HasId {
associatedtype IdType
var id: IdType { get }
}
struct A: HasId {
var id: Int = -1
}
struct B: HasId {
var id: Int = -1
}
func listIds<T: HasId>(items: [T]) {
print(items.map { $0.id })
}
listIds([A(id: 1), A(id: 2), A(id: 3)]) // [1, 2, 3]
listIds([B(id: 4), B(id: 5), B(id: 6)]) // [4, 5, 6]