2014-04-13 32 views
3

我在學習Stanford's CS193P course。在課堂上,Paul有一個演示項目「計算器」,他使用id作爲屬性的類型。他打算不使用特定的類,因爲他不想創建一個新的類,然後他不需要編寫文檔,甚至在更新時也不需要重新設計該類。 id可以解決所有這些問題。在公共API中使用'id'作爲返回類型或參數類型是否有很好的理由?

這是一個真正的好方法嗎? id是該屬性的返回類型,並用作另一個方法的參數類型。來電者如何知道id是什麼,以及如何提供正確的對象?通過閱讀代碼評論?

一般來說,有沒有很好的理由在公共API中使用id作爲返回類型或參數類型? (除init和工廠方法,但即使對於那些,instancetype建議。)

+1

注意'instancetype' [是多餘其名稱的方法開始用'init'](http://clang.llvm.org/docs/LanguageExtensions.html#related-result-types)。 –

+0

碰到'id'的地方最常見的地方是在訪問類似於JSON生成的NSArray或NSDictionary的元素時。在這種情況下,可能需要在運行時顯式測試以確定存在的類型。 –

回答

1
  1. 如果你的方法返回一個類,它是一類集羣中的一員,你應該返回id

  2. 如果您返回的對象的類不透明,未在公共標題中聲明,則應返回id。 (Cocoa偶爾會使用令牌或上下文數據等對象。)

  3. 集裝箱類應始終接受並返回其成分作爲id s。

+0

我知道第三名。對於#2,這真是一個很好的例子:調用者不會改變它的上下文或標記,只是將它用作參考並將它傳遞給不同的API。對於#1,我認爲來電者仍然不能改變它,只是爲未來的使用保留一個參考。 – ExBen

+0

更多問題,對於#2,你有任何真實的例子嗎? – ExBen

+0

對於#2,我可以想到兩個示例:'AVPlayer'' addPeriodicTimeObserverForInterval:'方法返回播放器回撥時使用的不透明上下文對象。其次,在10.4'NSPersistentStore'中是不透明的 - 當你查詢協調器的persistentStore時,你會得到一個'id'。 – iluvcapra

相關問題