Wie bekomme ich die Objective-C-Klasse eines Ivars?
Ich habe ein paar einfacheNSManagedObject
s erstelle ich in einem Unit-Test. Sie haben nur eine einzigename
Attribut des TypsNSString *
. Ich gebe immer meineNSManagedObject
das GleicheentityName
undClass
Name.
Ich möchte vermeiden, den folgenden Code 30 Mal schreiben zu müssen, um einen Komponententest einzurichten:
@interface FooTest : GHTestCase {
Foo *foo;
}
@end
@implementation FooTest
- (void) setUp {
[super setUp];
foo = [NSEntityDescription insertNewObjectForEntityForName:@"Foo"
inManagedObjectContext:managedObjectContext];
foo.name = @"foo";
}
@end
Schon seitfoo
ist ein ivar, ich würde denken, ich sollte in der Lage sein, ein Makro zu schreiben, um die Art von zu greifenfoo
(Foo
) und zum Erstellen von myFoo
:
#define InsertManagedObjectByVariable(variable) \
do { \
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])]; \
variable.name = (NSString *) CFSTR(#variable);
} while(0)
Dies verursacht jedoch die folgende Warnung:
variable = [NSEntityDescription insertNewObjectForEntityName:NSStringFromClass([typeof(variable) class])];
^
Expected expression
Ich dachte auch, ich könnte versuchen, den Typ mithilfe der object-c-Laufzeit zu bestimmenIVar
vonIvar class_getInstanceVariable(Class cls, const char* name)
, aber das einzigeIVar
Typinformationen verfügbar aus der Typcodierung vonivar_getTypeEncoding
istid
, was nicht reicht.
Kann sich jemand einen Weg überlegen, um die Typinformationen einesIVar
entweder zur Kompilierungszeit oder zur Laufzeit?