Swift仿制药Bool不能转换为Bool

时间:2017-06-10 07:06:12

标签: ios swift generics

我写了一个协议,如:

public protocol Protocol1 {
    func execute<T, R>(req: T) -> Promise<R>
}

实施协议如下:

struct Implemented1 : Protocol1 {
    func execute<String, Bool>(req : String) -> Promise<Bool> {
        return Promise<Bool>() { fulfill, reject in
           fulfill(true)
        }
    }
}

我收到以下错误:

&#39;布尔&#39;不能兑换为Bool&#39;

请帮我理解是什么问题。

1 个答案:

答案 0 :(得分:4)

问题出在方法声明的开头。

func execute<String, Bool>

谁教你以这种方式申报通用方法?

通用参数应该放在<>中,而不是实际类型!

要实施协议,您需要一个通用方法,而不是接受String并返回Bool的方法。

因此,编译器将StringBool视为通用参数的名称,而不是实际的swift类型。因此,当编译器说Bool无法转换为Bool时,实际上意味着swift Bool类型无法转换为通用参数Bool

我认为您需要的是相关类型。

public protocol Protocol1 {
    associatedtype RequestType
    associatedtype ResultType
    func execute(req: RequestType) -> Promise<ResultType>
}

struct Implemented1 : Protocol1 {
    typealias ResultType = Bool
    typealias RequestType = String
    func execute(req : String) -> Promise<Bool> {
        return Promise { fulfill, reject in
            fulfill(true)
        }
    }
}

P.S。这样:

Promise { fulfill, reject in
    fulfill(true)
}

可以简化为:

Promise(value: true)