Mam kilka prostych NSManagedObject
s tworzę w teście jednostkowym. Mają po prostu jeden atrybut name
typu NSString *
. Zawsze daję mojej NSManagedObject
tę samą nazwę entityName
i Class
.Jak uzyskać klasę Objective-C dla ivar?
chcę uniknąć konieczności pisania następujący kod 30 razy, aby skonfigurować test Jednostka:
@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest
- (void) setUp {
[super setUp];
foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:managedObjectContext];
foo.name = @"foo";
}
@end
Od foo
jest Ivar, to myślę, że powinienem być w stanie napisać makro chwycić rodzaj foo
(Foo
) i używać do tworzenia mojego Foo
:
#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)
jednak to powoduje następujące ostrzeżenie w brzękiem:
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
^
Expected expression
Pomyślałem też mógłbym spróbować określić typ użyciem objective-c czas pracy IVar
od Ivar class_getInstanceVariable(Class cls, const char* name)
, ale tylko informacja IVar
typu dostępne z kodowaniem typu z ivar_getTypeEncoding
jest id
, co nie jest wystarczające.
Czy ktoś może wymyślić sposób uzyskania informacji o typie obiektu IVar
w czasie kompilacji lub w czasie wykonywania?
Nie testowałem tego poza sprawdzeniem, czy kompiluje, ale czy nie można upuścić 'typeof()' i iść z '[zmienna klasa]'? –
Nie, ponieważ 'zmienna' jest zerowa. –