[英]Cannot specialize protocol type
Swift5.7 带有主要关联类型。 我尝试使用这些代码,但出现错误:无法专门化协议类型'GenericDelegate'
class BaseResponse {}
class ConcreteResponse: BaseResponse {}
protocol GenericDelegate<Response>: AnyObject {
associatedtype Response: BaseResponse
func didGetResponse(response: Response)
}
class BaseCGI<T:BaseResponse> {
weak var delegate: (any GenericDelegate<T>)? //error: Cannot specialize protocol type 'GenericDelegate'
func didGetResponse(response:T) {
self.delegate?.didGetResponse(response: response)
}
}
我们如何使具有指定关联类型的存在类型成为变量?
像这样使用:
class FooDelegate: GenericDelegate {
func didGetResponse(response: ConcreteResponse) {
//do something
}
}
let cgi = BaseCGI<ConcreteResponse>
cgi.delegte = FooDelegate()
cgi.didGetResponse(ConcreteResponse())
正如我所看到的,您必须使您的类BaseCGI
在响应类型和委托类型上都通用。 此外,您需要告诉编译器委托的响应类型与类的响应类型相同
class BaseCGI<Response: BaseResponse, Delegate: GenericDelegate> where Delegate.Response == Response {
weak var delegate: Delegate?
func didGetResponse(response: Response) {
self.delegate?.didGetResponse(response: response)
}
}
然后你创建一个实例
let cgi = BaseCGI<ConcreteResponse, FooDelegate>()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.