亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在“純” Swift中創建弱協議引用(不帶@objc)

如何在“純” Swift中創建弱協議引用(不帶@objc)

達令說 2019-11-21 12:53:14
weak除非a protocol聲明為@objc,否則引用似乎在Swift中不起作用,我不希望在純Swift應用程序中使用它。這段代碼給出了一個編譯錯誤(weak不能應用于非類類型MyClassDelegate):class MyClass {  weak var delegate: MyClassDelegate?}protocol MyClassDelegate {}我需要給協議加上前綴@objc,然后它才能工作。問題:什么是完成Swift的“純” Swift方法weak delegate?
查看完整描述

3 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

您需要將協議類型聲明為class。


protocol ProtocolNameDelegate: class {

    // Protocol stuff goes here

}


class SomeClass {

    weak var delegate: ProtocolNameDelegate?

}

我的理解是,使用class,您可以確保僅在類上使用此協議,而不會在枚舉或結構之類的其他東西上使用。


查看完整回答
反對 回復 2019-11-21
?
慕桂英4014372

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關鍵字和閉包發生的強大參考周期。


查看完整回答
反對 回復 2019-11-21
  • 3 回答
  • 0 關注
  • 632 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號