2016-05-01 3 views
4

У меня есть проблема с круговой зависимостью: При использовании новых RLMLinkingObjects для обратной связи, я получаю следующее сообщение об ошибке:RLMLinkingObjects циклической зависимость

Type argument 'RCon *' does not satisfy the bound ('RLMObject *') of type parameter 'RLMObjectType' 

У меня есть два класса RCON и RSan. RCon имеет несколько ссылок на RSan, а RSan ссылается на несколько RCon, так что это отношение «многие ко многим». Вот примеры декларации для классов.

Первый класс:

// RSan.h 

#import <Realm/Realm.h> 
#import <UIKit/UIKit.h> 

@class RCon; 

@interface RSan : RLMObject 
@property (readonly) RLMLinkingObjects<RCon*>* cons; 
@end 
RLM_ARRAY_TYPE(RSan) 

Другой класс:

// RCon.h 

#import <Realm/Realm.h> 
#import <UIKit/UIKit.h> 
#import "RSan.h" 

@interface RCon : RLMObject 
@property RLMArray<RSan*><RSan>* sans; 
@end 
RLM_ARRAY_TYPE(RCon) 
+1

Помимо приведенного ниже ответа, вы также можете обойти это ограничение языка Objective-C, используя дженерики только на одной стороне отношения. – bdash

ответ

5

Это связано с ограничением для Objective-C компилятор. Общие ограничения для RLMArray нуждаются в их элементах, которые должны быть подклассом RLMObject. Но компилятор Objective-C не может распознать его с @class пересылаемой декларации.

Чтобы решить эту проблему, я думаю, что единственный способ - объявить оба @interface в том же файле, а затем объявить их свойства с помощью расширения класса. Как следующее:

#import <Realm/Realm.h> 
#import <UIKit/UIKit.h> 

@interface RCon : RLMObject 
@end 
RLM_ARRAY_TYPE(RCon) 

@interface RSan : RLMObject 
@end 
RLM_ARRAY_TYPE(RSan) 

@interface RCon() 
@property RLMArray<RSan*><RSan>* sans; 
@end 

@interface RSan() 
@property (readonly) RLMLinkingObjects<RCon*>* cons; 
@end 

ПРИМЕЧАНИЕ: Все avobe код должен быть в том же файле.

+0

Большое спасибо за ваш ответ. Я понимаю сейчас. – user3182143

+0

Могу ли я иметь над вашей кодировкой в ​​ViewController, NSObjectClass или AppDelegate Class или что-то, что я хочу ViewController? – user3182143

+0

@ user3182143 Где угодно. Если вы хотите объявить код модели ViewController, вы можете. Просто импортируйте файл заголовка из файла, используя модели. –