代理介紹

  • id類型的成員屬性->協(xié)議->告訴對應(yīng)對象應(yīng)該實現(xiàn)哪些方法
    自己調(diào)用方法,然后由代理對象實現(xiàn)-> respondsToSelector:@selector( )
    如果方法可選實現(xiàn),就加一個判斷

  • 聲明一個代理分為三步:
    ①.聲明協(xié)議->告訴對應(yīng)的對象,該實現(xiàn)哪些方法
    ②.聲明一個id類型的成員屬性(weak修飾) ->不限制調(diào)用方法的對象類型(任意對象都可以實現(xiàn)對應(yīng)的方法)
    id<協(xié)議名> -> 僅僅是為了告訴別人對應(yīng)的協(xié)議是哪一個
    ③.自己調(diào)用自己協(xié)議的方法
    關(guān)鍵: respondsToSelector:@selector( ) 判斷代理對象能否響應(yīng)代理中的方法
    是否添加判斷的依據(jù)是根據(jù)協(xié)議中方法的標(biāo)識 :
    @optional -->要加
    @required -->不要加(如果方法前不加關(guān)鍵字修飾,默認(rèn)必須實現(xiàn))
    如果對應(yīng)對象沒有實現(xiàn)就會報錯

  • 使用代理:
    ①.設(shè)置代理對象 ??
    ②.遵循協(xié)議 ?? 不遵循協(xié)議同樣可以實現(xiàn)代理方法,只是在實現(xiàn)方法書寫時,不會智能提示出方法,需要手寫
    本質(zhì)( 寫協(xié)議 ->告訴對應(yīng)對象應(yīng)該實現(xiàn)哪些方法)
    協(xié)議命名通常有一個特點: 類名 + 代理的名字(成員屬性的名字)
    ③.實現(xiàn)方法

需要注意的是:

  • 在OC中遵循協(xié)議時可以寫基協(xié)議甚至不遵循協(xié)議都是沒有問題的,只是不遵循協(xié)議在實現(xiàn)代理方法時沒有智能提醒,只能靠手敲
  • 而Swift更為嚴(yán)謹(jǐn),如果不遵循協(xié)議或者寫成基協(xié)議都是不允許的,直接會報錯
    比如使用UICollectionView時,為了監(jiān)聽滾動,設(shè)置代理后,遵循了UIScrollViewDelegate協(xié)議,就會報錯
    必須要寫成:
    extension JSEmoticonKeyBoardView: UICollectionViewDelegate
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容