2016-04-20 5 views
0

, поэтому я пытаюсь сделать повторно используемую функцию, где я передаю объект (у меня есть 3 класса объектов), но когда я пробую код ниже , код лает у меня, что value of type object has no member id. Он показывает это в строке кода: arrayFromDB.append(items.id)Пытаясь сделать повторно используемую функцию, передав объект в Realm, дает ошибку

Это странно, потому что все три моих объектов содержат 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

Я ничего не знаю о Царстве, но похоже, что вы хотите получить общую функцию. Если это так, это должно быть определено как: 'func deleteUnwanted (fromJSON: [Int], db: T.Type)', используя 'Object.Type', вы фактически просто используете' Object'. Также вы должны определить тип или протокол с свойством 'id', а затем ограничить общий параметр таким, чтобы получить доступ к' id' внутри функции. – sgib

+0

Когда я пытаюсь это сделать, он возвращает 'Невозможно преобразовать значение типа T.Type 'в ожидаемый тип аргумента« Object.Type »в строке' let getFromDB = realm.objects (db) ' Тип всегда будет объекта, поэтому я не уверен, должен ли я сделать его общим. Он может иметь 3 разных объекта, ничего больше. – SoundShock

+0

Возможно, вы можете попробовать 'func deleteUnwanted ...', чтобы ограничить его тем, что он всегда является объектом, но даже тогда вы не сможете получить доступ к свойству 'id', не задавая тип, обладающий свойством' id'. – sgib

ответ

1

Realm DB не имеет ничего общего с вашей проблемой.

Swift - это не типичный язык утки. Вы знаете, что все ваши объекты имеют поля 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]