1

I'm not sure that this not duplicate. I have protocol and several classs that confurm to it.

protocol DbObject: class {
    class func tableName() -> String
    init(set: FMResultSet)
    func save(db: FMDatabase) 
}

And here how I use it:

func updateTable<T where T:DbObject>(nodes: [T]) {
    self.db.executeUpdate("DELETE from \(T.tableName())")
    for elem in nodes {
        elem.save(self.db)
    }
}

func loadAllFromObjectTable<T where T:DbObject>(cl: T) -> [T] {
    var objArr = [T]()
    if let set = db.executeQuery("select * from \(T.tableName())") {
        while (set.next() ?? false) {
            let obj = T(set: set)
            objArr.append(obj)
        }
    }
    return objArr
}

But I wanna that function loadAllFromObjectTable get as parameter class that confirms protocol, not object. How can I achieve that?

EDIT:
From here https://stackoverflow.com/a/26229630/820795

func loadAllFromObjectTable<T where T:DbObject>(_: T.Type) -> [T] {
    var objArr = [T]()
    if let set = db.executeQuery("select from \(T.tableName())") {
        while (set.next() ?? false) {
            if let obj = T(set: set)
            objArr.append(obj)
        }
    }
    return objArr
}

And usage:

manager.loadAllFromObjectTable(SignNote.self)
Community
  • 1
  • 1
Gralex
  • 4,285
  • 7
  • 26
  • 47

0 Answers0