2016-03-07 50 views
2

儘管問題相當廣泛,但我對使用Realm library時最近播種的一個病例感到好奇。正如我之前在很多場合使用過的協議(委託),還使用了<>導入的類。而現在這行代碼中,我完全不瞭解或根本不都明白,如果我誤以爲:Objective-C中尖括號的含義?

@property (nonatomic, strong) RLMArray <ExerciseLog *><ExerciseLog> * exerciseLogs; 

我想這行<ExerciseLog> * exerciseLogs的第二部分是用來確保exerciseLogs可能是任何符合ExerciseLog協議的ExerciseLog的實例,我的假設是否正確?

或簡單地說如果用戶發送不同的對象,然後預期的,應用程序不會崩潰,並且將分配一個默認值。

這個部分我猜測,這是某種安全鑄造,以便返回的對象確認爲ExerciseLog。

回答

1

類接口定義中的尖括號表示您的類符合的協議。

協議幾乎就像Java或C#中的接口一樣,另外Objective-C協議中的方法可以是可選的。

另外在Objective-C中,您還可以聲明變量,參數或實例變量以符合多種協議。示例

NSObject * myVariable; 在這種情況下,該類必須是NSObject或一個子類(只有NSProxy及其子類會失敗),並且它還必須符合NSCoding和UITableViewDelegate協議。

在Java或C#中,這隻能通過實際聲明所述類來實現。

2

Obj-C協議一致性和泛型的組合。 RLMArray被宣告爲

@interface RLMArray < RLMObjectType : RLMObject * > : NSObject<RLMCollection,NSFastEnumeration> 

它有一個泛型參數。這是<ExerciseLog *>

第二部分<ExerciseLog>符合給定類型的協議。

順便說一句,該協議是用RLM_ARRAY_TYPE宏聲明的。代碼似乎有點複雜,但它可能是一種較早的方式來強制數組的元素類型(RLMArray<protocolX>不可分配給RLMArray<protocolY>)。

引用的文檔:

不同於一個NSArray,RLMArrays保持單個類型,由objectClassName屬性指定。這在這些文檔中被稱爲數組的「類型」。

當聲明一個RLMArray屬性時,必須將該類型標記爲符合協議,其名稱應與其包含的對象相同(請參閱RLM_ARRAY_TYPE宏)。 RLMArray屬性也可以使用Objective-C泛型(如果可用)。例如: