推断完成块中的通用类型

时间:2018-10-12 15:18:41

标签: swift

我有一个功能:

static func requestArray<T>(completion: @escaping (_ result: Result<[T], Error>) -> ()) {

}

这样称呼:

MyClass.requestArray() { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

但是,这无法正常工作,因为它无法推断出通用类型T。如何更改我的代码,使其能够识别T应该是什么类型? (假设array的类型应为[String]

2 个答案:

答案 0 :(得分:1)

如果API将类型移动到签名中,通常会更方便,以简化关闭过程:

static func requestArray<T>(of: T.Type, completion: @escaping (_ result: Result<[T], Error>) -> ()) { }

以这种方式完成后,呼叫将变为:

MyClass.requestArray(of: String.self) { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

T是返回类型时,此方法也很好用。在Codeable之类的方法中,请参见decode(_;from:)以获得该方法的一个很好的例子。

答案 1 :(得分:0)

调用函数时,您已经在完成处理程序中明确声明了result的类型:

MyClass.requestArray() { (result: Result<[String], Error>) in
    switch result {
    case .success(let array):
        break
    case .failure(let error):
        break
    }
}