试图通过在Realm中传递Object来实现可重用的功能,会出错

时间:2016-04-20 07:04:29

标签: swift realm reusability

所以我正在尝试创建一个可重用的函数,我传递了对象(我有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"
    }
}

1 个答案:

答案 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]