Как я могу получить Objective-C класса ивара?
У меня есть куча простых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
Я также подумал, что могу попытаться определить тип, используя время выполнения target-cIVar
отIvar class_getInstanceVariable(Class cls, const char* name)
, но единственныйIVar
информация о типе доступна из кодировки типа изivar_getTypeEncoding
являетсяid
, что недостаточно.
Может кто-нибудь придумать способ получения информации о типеIVar
или во время компиляции или во время выполнения?