この:
@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;
}
吐き出すこの:
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
)
はそれが正しいですか?並べ替え一般的に、これは実際に使用すべきパターンではありません。
あなたが何かやって方がいいでしょう:それは、コードの余分な行のカップルですが、それはpedantically入力さ
[a enumerateObjectsUsingBlock:^(Blarg * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
obj.flag = YES;
}];
:
[a enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
Blarg *b = obj;
b.flag = YES;
}];
あるいは、現代のコンパイラとのより良いをこれにより、コードが将来変更された場合にコンパイラが悲鳴を上げることになります。メタプログラミングは、コンパイラの能力を損なうことになります。
'setFoo:'メソッドは 'BOOL'引数をとりますが、あなたは' NSNumber'を提供しています。あなたはそうすることはできません。 –
それでは、正しい方法は何ですか? –