簡體   English   中英

如何使用符合通用協議的弱委托創建基類?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM