2017-09-29 51 views
1

所以基本上我有一个名为型号父类具有以下功能从父类的子类类型的返回对象自动

​​

它的伟大工程,但这里的东西。我有模型的几个子类,如“学校”,“人物”等。对于每个子类我必须做这样的事情

static func all(complete: @escaping ([School]) -> Void) { 
    super.allModels { (models) in 
     complete(models as! [School]) 
    } 
} 

它所做的就是调用该方法并将结果转换到其自己的类型。每个子类的每种方法都必须这样做,这真的很烦人。有没有办法从父类自动执行此操作?所以调用School.all()将调用Model.all(),但返回一个学校,而Person.all()也会调用Model.all(),但返回一个人。

回答

1

你可以用Generics摆脱所有的重复。

static func allModels<T>(complete: @escaping ([T]) -> Void) 
    { 
     var models = [T]() 
     DatabaseHelper.firebase.child(getDB()).observeSingleEvent(of: .value) { (snapshot) in 
      if let data = snapshot.value as? [String: Any] { 
       for id in data.keys { 
        if var modelData = data[id] as? [String: Any] { 
         modelData[MasterField.id] = id 
         let model = self.init(data: modelData) 
         models.append(model as! T) 
        } 
       } 
      } 
      complete(models) 
     } 
    } 

值得一提的是,如果在完成闭合推断类型是从你打电话从allModels()类不同,强制垂头丧气(as!)会崩溃。

+0

使用你的代码中,我得到以下错误:通用参数“T”不能推断 – rmaes4

+0

尝试使用此代码来调用它:在0​​School.allModels {(学校)在学校{ 打印学校(school.name ) } } – rmaes4

+0

如果我添加静态func allModels 那么该错误消失,但我得到一个新的。 “类型模型的值没有成员名称” – rmaes4