У меня есть куча простых NSManagedObject
s, которые я создаю в модульном тесте. У них есть только один атрибут 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
либо во время компиляции, либо во время выполнения?