2015-06-16 32 views
2

我與這句話的一部分難倒:請幫忙協議代碼,沒有任何意義

@property(nonatomic, readonly) NSArray <id<NSFetchedResultsSectionInfo>>*sections 

這個屬性屬於NSFetchedResultsController類。 儘管NSFetchedResultsSectionInfo是一個協議,id<NSFetchedResultsSectionInfo>是一個必須符合NSFetchedResultsSectionInfo協議的對象類型。 id<NSFetchedResultsSectionInfo>不是協議,因此將它們括在尖括號內 <id<NSFetchedResultsSectionInfo>>是沒有意義的。 聲明NSArray <id<NSFetchedResultsSectionInfo>>對我來說沒有意義,因爲如何使對象類型id成爲NSArray類的協議。有人可以對此有所瞭解嗎?謝謝。

回答

1

該語法實際上並不意味着該數組符合任何協議。該符號具有誤導性。它只告訴你裏面的這個數組是id並且符合NSFetchedResultsSectionInfo協議。

documentation狀態:

區段陣列中的對象實現了NSFetchedResultsSectionInfo協議。

確保它只包含指定類型的值,並且編譯器會告訴您如果您嘗試插入不兼容的對象,這是爲了讓編譯器知道。

你可能想看看這apple doc的最後一節。

例如,如果您正在編寫使用Core Data框架的iOS應用程序,則可能會遇到NSFetchedResultsController類。此類旨在幫助數據源對象將存儲的數據提供給iOS UITableView,從而輕鬆提供諸如行數等信息。

如果您使用的表格視圖的內容分爲多個部分,還可以向提取的結果控制器請求相關部分信息。 NSFetchedResultsController類不是返回包含此部分信息的特定類,而是返回一個匿名對象,該對象符合NSFetchedResultsSectionInfo協議。這意味着仍然可以查詢對象以獲取所需的信息,例如某一節中的行數

即使您不知道sectionInfo對象的類,NSFetchedResultsSectionInfo協議也會指示它可以響應到numberOfObjects消息。

+0

感謝您的解釋。我非常感謝。我認爲NSArray > *部分是我錯過了一些新的語法。另一方面,爲什麼蘋果將@property(nonatomic,只讀)NSArray > *部分作爲屬性聲明。它給人的印象是這確實是協議中的實際財產聲明。 –

+0

只需在協議聲明@property(nonatomic,readonly)NSArray *節中指明並且只是解釋NSArray的對象是id類型的NSFetchedResultsSectionInfo>就不會更清楚了。將所有內容放在一行中都會給人以實際聲明的印象。 –

+0

有趣。從來沒有遇到過這個。 – cacau