Как получить класс Objective -C для ивара?

У меня есть куча простых NSManagedObjects, которые я создаю в модульном тесте. У них есть только один атрибут nameтипа NSString *. Я всегда даю своим NSManagedObjectодно и то же entityNameи Classимя.

Я хочу избежать написания следующего кода 30 раз для настройки модульного теста:

@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest

- (void) setUp {
  [super setUp];

  foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
                                      inManagedObjectContext:managedObjectContext];
  foo.name = @"foo";
}
@end

Поскольку fooявляется иваром, я думаю, что должен написать макрос для захвата типаfoo(Foo), и используйте для создания моегоFoo:

#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)

Однако это вызывает следующее предупреждение в clang:

variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
                                                                               ^
                                                             Expected expression

Я также подумал, что могу попытаться определить тип, используя цель -c среды выполнения IVarиз Ivar class_getInstanceVariable(Class cls, const char* name), но единственная информация о типе IVar, доступная из кодировки типа из ivar_getTypeEncoding, это id, которая не недостаточно.

Может ли кто-нибудь придумать способ получить информацию о типе IVarлибо во время компиляции, либо во время выполнения?

5
задан Heath Borders 29 June 2012 в 19:16
поделиться