Dieses:
@interface Blarg:NSObject
@property BOOL flag;
@end
@implementation Blarg
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *a = @[[Blarg new], [Blarg new], [Blarg new]];
NSLog(@"Start %@", [a valueForKey:@"flag"]);
[a setValue:@YES forKey:@"flag"];
NSLog(@"Yes %@", [a valueForKey:@"flag"]);
[a setValue:@NO forKey:@"flag"];
NSLog(@"No %@", [a valueForKey:@"flag"]);
}
return 0;
}
spuckt diese:
2016-04-14 23:28:00.648 dfjkdf[767:101069] Start (
0,
0,
0
)
2016-04-14 23:28:00.650 dfjkdf[767:101069] Yes (
1,
1,
1
)
2016-04-14 23:28:00.650 dfjkdf[767:101069] No (
0,
0,
0
)
Ist es richtig? Irgendwie. Im Allgemeinen ist dies nicht wirklich ein Muster, das Sie verwenden sollten.
Du bist besser dran, etwas zu tun wie:
[a enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Blarg *b = obj;
b.flag = YES;
}];
Oder besser mit einem modernen Compiler:
[a enumerateObjectsUsingBlock:^(Blarg * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.flag = YES;
}];
Es ist ein paar zusätzliche Zeilen Code, aber es ist pedantisch Typ Korrekt und damit der Compiler wird schreien, wenn der Code in der Zukunft ändert, um es zu brechen. Meta-Programmierung hemmt die Fähigkeit des Compilers, Ihnen zu helfen.
Die Methode 'setFoo:' benötigt ein 'BOOL'-Argument, aber Sie stellen eine 'NSNummer' bereit. Du kannst es nicht so machen. –
Also, was ist der richtige Weg? –