【发布时间】:2017-10-10 18:24:38
【问题描述】:
例子:
struct Wrapper<T> {
var key: Int = 0
var listeners: [Int: (T) -> Void] = Dictionary()
mutating func add(_ handler:@escaping (T) -> Void) {
self.key += 1
self.listeners[self.key] = handler
}
func get(key: Int) -> (T) -> Void {
return self.listeners[key]!
}
}
测试协议:
protocol CommonProtocol {
}
创建测试类包装器的类
class C {
var wrapper: Wrapper = Wrapper<CommonProtocol>()
func add<T: CommonProtocol>(_ handler: @escaping (T) -> Void) {
self.wrapper.add(handler) //Cannot convert value of type '(T) -> Void' to expected argument type '(CommonProtocol) -> Void'
}
}
我得到错误:
Cannot convert value of type '(T) -> Void' to expected argument type '(CommonProtocol) -> Void'
问题:
为什么
(T) -> Void不能转换为(CommonProtocol) -> Void?T被明确声明为<T: CommonProtocol>
这是我的第一个问题,如果您有任何建议,请随时与我联系
【问题讨论】:
-
编译器相当正确;
(T) -> Void不是(CommonProtocol) -> Void。假设String : CommonProtocol和Int : CommonProtocol。用String替换T。如果(T) -> Void可以转换为(CommonProtocol) -> Void,那么我们可以将Int传递给String参数。 -
@Hamish,你是对的,但是如果我将函数
add更改为:func add(_ handler: @escaping (CommonProtocol) -> Void)我没有收到任何错误,看起来如果问题是你所说的,这一定是一个错误还有 -
为什么你会认为这是一个错误?你现在将
(CommonProtocol) -> Void传递给期望(CommonProtocol) -> Void的东西——这是完全合法的。