我写了一个协议,如:
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;
请帮我理解是什么问题。
答案 0 :(得分:4)
问题出在方法声明的开头。
func execute<String, Bool>
谁教你以这种方式申报通用方法?
通用参数应该放在<>
中,而不是实际类型!
要实施协议,您需要一个通用方法,而不是接受String
并返回Bool
的方法。
因此,编译器将String
和Bool
视为通用参数的名称,而不是实际的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)