首页 文章

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

提问于
浏览
1

我们试图在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
    }

}

但这不编译:"Use of undeclared Type T"在 func completionBlock() ,此时的类型是通用的,它只需要符合协议Mappable,但我们不知道如何指定它 .

谢谢!!,问候

1 回答

  • 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)
    }
    

相关问题