现在我使用Realm
创建了singleton
,但是我遇到了问题,如果我想在closure
中返回generic
,并且有不同的类型(例如:.Case类型返回[案例],。产品类型返回[产品]),但我不知道实现这个功能。
任何人都可以帮我解决这个问题吗?谢谢!
数据类型:
enum DataType{
case Case
case Product
case Category
case Composition
}
fetchItem功能:
func fetchItem<T>(type: DataType,complete:@escaping ([T]) -> ()) {
var list:[T]? = []
switch type {
case .Case:
let realm = try! Realm()
let caseResult = realm.objects(Case.self)
caseResult.forEach { (item) in
...
}
complete([])
return
case .Product:
return
case .Category:
return
case .Composition:
return
}
}
答案 0 :(得分:1)
模板化函数是您想要获得的类。 让我们以此函数为例
func showTemplate<T>(myVariable: T) {
print(myVariable)
}
在这里,如果我想调用showTemplate函数,我必须使用我想要的类型:
showTemplate<String>() # print a string
showTemplate<Int>() # print a int
showTemplate<myClass> # print a myClass
所以你遇到了问题,但是因为使用了模板,你需要在调用函数之前知道这个类。
例如,您可以尝试使用继承并将您的motherClass与您想要的类一起模板化。
class wantedClass {
var myCaseVariable: Case
var myProductVariable: Product
var myThingsVariable: Things
init() {
}
fillClass<T: Case>() {
// set case
}
// Etc etc
}
此外,我不认为模板是一个很好的解决方案,我建议看看这个:Using a Type Variable in a Generic
答案 1 :(得分:0)
我相信你不能只使用泛型类型(不是任何类持有者等)在一个地方完全不同的类型。也许你应该为每个项目(fetchCaseItems()
,fetchProductItems
等)创建单独的func。阅读非常清楚,每个func只负责自己的数据类型。