У меня есть куча простых NSManagedObject
, которые я создаю в модульном тесте. У них есть только один атрибут 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
Я также подумал, что могу попытаться определить тип, используя среду выполнения target-c IVar
из Ivar class_getInstanceVariable(Class cls, const char* name)
, но единственная информация о типе IVar
, доступная из кодировки типа из ivar_getTypeEncoding
, — это id
, чего недостаточно.
Может ли кто-нибудь придумать способ получить информацию о типе IVar
либо во время компиляции, либо во время выполнения?
typeof()
и перейти к[variable class]
? - person Phillip Mills   schedule 29.06.2012variable
равно нулю. - person Heath Borders   schedule 29.06.2012