在Swift中声明一个返回带有泛型T.Type的闭包的函数

时间:2016-02-13 11:26:43

标签: swift generics

我们正在尝试在Swift中创建一个函数,它返回一个闭包。返回类型如下:

func completionBlock() -> (Response<T, NSError>) -> ()

其中Response本身是一个包含2个泛型的结构。第二个将始终是NSError,但第一个取决于开关。

回应声明:

public struct Response<Value, Error: ErrorType> { ...

我们想要实现的是一个函数,它将返回一个闭包,其类型取决于变量的值。 根据此值和交换机,它指定一种或另一种类型,泛型参数的唯一要求是它必须符合特定协议,但我们无法找到解决方案。

到目前为止我们得到的是:

class BaseClass {
    var endpoint: Int
    ... 

    func completionBlock() -> (Response<T, NSError>) -> () {

        switch endpoint
        {
        case 1:
            return getHandleResponseClosure(Car.self)
        case 2:
            return getHandleResponseClosure(Truck.self)
        }
    }

    func getHandleResponseClosure<T: Mappable>(_: T.Type) -> (Response<T, NSError>) -> () {

        let closure = { (_: Response<T, NSError>) -> () in
            // ...
        }
        return closure
    }

}

但是这不能编译:&#34;在 func completionBlock()中使用未声明的Type T&#34; ,此时的类型是通用,它只需要符合协议Mappable,但我们不知道如何指定它。

谢谢!!,问候

1 个答案:

答案 0 :(得分:0)

虽然您的代码存在其他问题,但基本的问题是方法签名中的泛型类型必须直接在方法名称之后声明。请看下面的completionBlock。此代码编译并运行。

struct Response<T, E: Error> {

}

struct Car {}
struct Truck {}

class BaseClass {

    func completionBlock<T>() -> ((Response<T, NSError>) -> ()) {
        return { response in /* What goes here? */ }
    }

}

let c = BaseClass()
let r: (Response<Car, NSError>) -> () = c.completionBlock()

在旁注中,我会将struct Response<T, E: Error>替换为...

enum Response<T> {
case success(T)
case error(Error)
}