3 回答

TA貢獻1795條經驗 獲得超7個贊
您需要將協議類型聲明為class。
protocol ProtocolNameDelegate: class {
// Protocol stuff goes here
}
class SomeClass {
weak var delegate: ProtocolNameDelegate?
}
我的理解是,使用class,您可以確保僅在類上使用此協議,而不會在枚舉或結構之類的其他東西上使用。

TA貢獻1871條經驗 獲得超13個贊
補充答案
我一直對代表是否應該軟弱感到困惑。最近,我了解了有關委托的詳細信息以及何時使用弱引用,因此為了將來的讀者,讓我在此處添加一些補充要點。
使用weak關鍵字的目的是避免強參考循環(保留循環)。當兩個類實例相互具有強引用時,就會發生強引用循環。他們的參考計數永遠不會為零,所以他們永遠不會被釋放。
weak如果委托是一個類,則僅需要使用。Swift結構和枚舉是值類型(在創建新實例時會復制它們的值),而不是引用類型,因此它們不會構成強引用周期。
weak引用始終是可選的(否則,您將使用unowned),并且始終使用var(非let),以便可以在nil取消分配可選項時將其設置為。
父類自然應該對其子類有強烈的引用,因此不要使用weak關鍵字。但是,當孩子想要引用其父母時,應通過使用weak關鍵字使其成為弱引用。
weak當您想要引用一個您不擁有的類時,應該使用,而不是僅用于引用其父類的孩子。當兩個非層次類需要相互引用時,請選擇一個弱類。您選擇的一種取決于情況。有關更多信息,請參見此問題的答案。
通常,應將委托人標記為,weak因為大多數委托人都在引用他們不擁有的類。當孩子使用委托與父母溝通時,這絕對是正確的。文檔建議使用弱引用作為委托。(但是看這個,太)。
協議可用于引用類型(類)和值類型(結構,枚舉)。因此,在可能需要弱化委托的情況下,必須使其成為僅對象協議。做到這一點的方法是添加AnyObject到協議的繼承列表中。(過去您是使用class關鍵字來完成此操作的,但AnyObject現在是首選。)
protocol MyClassDelegate: AnyObject {
// ...
}
class SomeClass {
weak var delegate: MyClassDelegate?
}
進一步研究
閱讀以下文章有助于我更好地理解這一點。他們還討論了相關問題,例如unowned關鍵字和閉包發生的強大參考周期。
- 3 回答
- 0 關注
- 632 瀏覽
添加回答
舉報