3

我明白協議的目的是什麼(使一個類型符合方法或/和屬性的集合列表),但我不明白具有所有可選方法的協議的目的是什麼。一個例子是UITextFieldDelegate如果所有方法都是可選的,協議的目的是什麼?

如果在協議中所有的方法都是可選的,那麼爲什麼你會遵守協議,而不是隻從頭開始寫你的類中的方法?在這種情況下,我沒有看到符合協議的好處或目的。

那裏的可選方法就像可以實現的功能建議一樣嗎?

+0

檢查這個問題也http://stackoverflow.com/questions/691246/why-would-i-make-an-all-optional-message-protocol?rq=1它可以幫助你 –

+0

所有偉大的答案。對另一案件的評論是非常有幫助的。我認爲所有可選協議的原因主要用於代表。我檢查了與其他問題類似的答案,但提供的所有答案都是有意義的。再次感謝大家! – Chris

回答

1

歷史上,對於Cocoa中的代表和數據源,使用了非正式協議。非正式的協議被實現槽的類別爲NSObject類:

@interface NSObject (NSTableViewDelegate) 

- (int)numberOfRowsInTableView:(NSTableView *)tableView; 

// ... 

@end 

後來,在協議的任意方法進行了介紹。這種改變導致更好地記錄班級責任。如果您在代碼中看到該類符合NSTableViewDelegate,您懷疑某處存在表視圖,該視圖由此類的實例管理。

此外,此更改導致在編譯時更強大的檢查。如果程序員不小心將錯誤的對象分配給delegatedataSource屬性,編譯器會發出警告。

但是你的假設也是正確的。可選的方法也是可能的功能的建議。

1

默認情況下,協議中的所有方法都是必需的。每種方法都必須標記爲可選,如果所有內容都正確運行,則必須標記爲可選。

如果在協議中所有的方法都是可選的,那麼爲什麼要遵守協議,而不是僅僅從頭開始在類中編寫函數?

符合協議允許您的類告訴其他對象的方法,而沒有其他對象需要知道您的類。當使用Delegation時,這非常有用,因爲它允許委託人決定他們希望接收/提供給另一個班級的信息。


例如,UIScrollViewDelegate協議只定義了可選的方法。可以說,我們有一個類Foo,我們想知道什麼時候情況改變UIScrollView

如果我們決定拋棄該協議並從頭開始實現這些功能,我們如何告知UIScrollView我們實現了哪些方法以及在發生某些事件時調用哪些方法?沒有什麼好的方法可以找到。當UIScrollView建成時,它不知道Foo,所以它不知道它實現了什麼方法。此外,Foo無法知道UIScrollView可以調用哪些方法。

然而,當UIScrollView建成時,它確實知道關於UIScrollViewDelegate。因此,如果Foo符合UIScrollViewDelegate協議,則現在有一個通用定義,FooUIScrollView可以遵循。因此Foo可以實現它所關心的任何方法,如scrollViewDidScroll:UIScrollView只需檢查代理是否實施了UIScrollViewDelegate中的方法。

1

協議爲一個對象與另一個對象之間的接口建立契約。方法是可選的這一事實只是說你不必實現這個特定的方法,但是如果你的應用程序需要它,你也可以實現。

一般來說,如果您符合所有方法都是可選的協議,但是您出於某種原因正在執行此操作,即您計劃實施一種或多種方法。僅僅因爲協議的所有方法都是可選的並不意味着你不會實現它們中的任何一個,而只是簡單地說你可以選擇哪些與你的特定情況相關。

例如,考慮UITextFieldDelegate協議。一般情況下,你會遵循這個原則,因爲你想要指定,例如,是否允許某些字符被插入到文本字段中,或者當按下回車鍵時應該怎麼做。有時你只想實現前者。有時你只想實施後者。有時候你會這樣做。但僅僅因爲你選擇實現其中一個並不意味着你一定想要做另一個(但你可以如果你想的話)。坦率地說,如果你真的不想實現任何方法,你可能甚至不會指定文本字段的delegate,也懶得指定你符合協議。底線,完全由可選方法組成的協議基本上說「如果您需要它,這是您可能選擇實施的方法的文檔化界面」。該協議對於建立可能的接口仍然非常有用,但並不強制你實現那些你不需要的方法。