2017-09-29 49 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