如何在泛型中返回闭包

时间:2018-01-05 12:42:23

标签: ios swift generics closures realm

现在我使用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
    }
}

2 个答案:

答案 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只负责自己的数据类型。