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