繁体   English   中英

无法专门化协议类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM