У меня есть куча простых NSManagedObject
s Я создаю в единичном тесте. У них просто есть один атрибут name
типа NSString *
. Я всегда даю NSManagedObject
то же самое имя entityName
и Class
.Как получить класс Objective-C для ivar?
Я хочу, чтобы избежать того, чтобы написать следующий код 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)
Однако, это вызывает следующее предупреждение в звоне:
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
^
Expected expression
Я также думал, что я мог бы попытаться определить тип, используя Objective-C выполнения IVar
от Ivar class_getInstanceVariable(Class cls, const char* name)
, но только информация IVar
типа доступны из кодировки типа из ivar_getTypeEncoding
является id
, что не достаточно.
Может кто-нибудь подумать о способе получения информации о типе IVar
либо во время компиляции, либо во время выполнения?
Не тестировали это, не видя, компилирует ли он, но не можете ли вы сбросить 'typeof()' и пойти с '[variable class]'? –
Нет, потому что 'variable' равно нулю. –