2016-04-15 14 views
0

のすべての要素にプロパティを設定する方法:のObj-C私はこのような何かをしようとしている配列

fooは、要素のクラスのパブリックプロパティ(タイプ BOOL)である
[array makeObjectsPerformSelector:@selector(setFoo:) withObject:[NSNumber numberWithBool:YES]]; 

配列の。しかし、これは動作していないと私は配列をループし、配列の各要素の[array[i] setFoo:YES]を呼び出すときにうまく動作するので、私は引数を渡している方法と関係していると思う。私も@YES@"YES"を渡そうとしました。

+1

'setFoo:'メソッドは 'BOOL'引数をとりますが、あなたは' NSNumber'を提供しています。あなたはそうすることはできません。 –

+0

それでは、正しい方法は何ですか? –

答えて

4

この:

@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; 
    }]; 

あるいは、現代のコンパイラとのより良いをこれにより、コードが将来変更された場合にコンパイラが悲鳴を上げることになります。メタプログラミングは、コンパイラの能力を損なうことになります。

+3

'id'の代わりに' Blarg'の型で 'obj'パラメータを宣言すると列挙はさらに簡単になります。次に、単に 'obj.flag = YES;'を実行します。 – rmaddy

+0

@rmaddyありがとう!私はいつもあなたが今それを行うことができることを忘れています...最初にブロックを作成したとき、コンパイラはそれを行うことができませんでした。 :) – bbum

関連する問題