[英]How do you create a base class with a weak delegate that conforms to a generic protocol?
我想為UIViews創建一個基類,它要求委托符合View定義的特定協議。
class BaseView<P>: UIView {
weak var delegate: P?
}
protocol MyProtocol {}
class MyView: BaseView<MyProtocol> {}
這給了我錯誤:“'weak'不能應用於非類綁定的'T';考慮添加具有類綁定的協議一致性”。
我該如何解決這個錯誤? 或者有一些工作嗎? 或者首先讓代理變量變弱是不是必要的? 提前致謝。
由於weak是分配給類類型而不是struct的任何屬性,因此必須將泛型參數顯式約束為類類型,並且這樣做:
class BaseView<P: AnyObject>: UIView {
weak var delegate: P?
}
@objc protocol MyProtocol {
}
class MyView: BaseView<MyProtocol> {
}
只有一個需要澄清。 通常,為了使協議成為類型類型,您可以通過這種方式使其符合類:
protocol MyProtocol: class { }
但是,由於某種原因,如果您這樣做,編譯器會拋出錯誤。 我了解到這是一個可以在這里學到更多的錯誤:
所以添加@objc
有助於使警告和錯誤兩者無聲。
您應該通過添加MyProtocol
為您的通用添加類型約束,並創建一個符合MyProtocol
的類。
你可以在這里找到更多信息。
更新的代碼:
class BaseView<P: MyProtocol>: UIView {
weak var delegate: MyProtocol?
}
protocol MyProtocol: class {}
class MyProtocolImp: MyProtocol {
}
class MyView: BaseView<MyProtocolImp> {
}
但我不知道為什么你在課堂上使用P
參數。 沒有這個你可以寫:
class BaseView: UIView {
weak var delegate: MyProtocol?
}
protocol MyProtocol: class {}
class MyView: BaseView {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.