首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能专门化协议类型

不能专门化协议类型
EN

Stack Overflow用户
提问于 2022-07-22 09:28:48
回答 1查看 423关注 0票数 -1

Swift5.7附带了主要的关联类型。我尝试使用这些代码,但它显示了错误:不能专门化协议类型'GenericDelegate‘

代码语言:javascript
复制
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)
    }
}

如何使具有指定关联类型的存在类型成为变量?

像这样使用:

代码语言:javascript
复制
class FooDelegate: GenericDelegate {
    func didGetResponse(response: ConcreteResponse) {
        //do something
   }

}

let cgi = BaseCGI<ConcreteResponse>
cgi.delegte = FooDelegate()
cgi.didGetResponse(ConcreteResponse())
EN

回答 1

Stack Overflow用户

发布于 2022-07-22 09:45:34

在我看来,您必须使类BaseCGI在响应类型和委托类型上都是通用的。此外,您需要告诉编译器,委托的响应类型与类的响应类型相同。

代码语言:javascript
复制
class BaseCGI<Response: BaseResponse, Delegate: GenericDelegate> where Delegate.Response == Response {
    weak var delegate: Delegate?

    func didGetResponse(response: Response)  {
        self.delegate?.didGetResponse(response: response)
    }
}

然后创建一个实例,如

代码语言:javascript
复制
let cgi = BaseCGI<ConcreteResponse, FooDelegate>()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73078122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档