[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

NSArrayの全ての要素に対して一斉にメッセージを送りたい

NSArrayの全ての要素に対して一括で同じ処理をしたいときなんかがある.

全ての要素が同じインスタンスメソッドを持っているなら,それを簡単に実行することができる.


まあ,例えば,クラスPersonの属性に身長heightがあって,さらに身長を1cm伸ばすようなインスタンスメソッドgrowUpがあるとする.

で,NSArrayの要素として,Personのインスタンスがたくさん入ってるときに,その全ての要素に対してgrowUpを呼びたいときがあるかもしれない.*1

そんなときは,NSArrayのメソッドのmakeObjectsPerformSelector:を使えばいい.引数は呼ばたいメソッドのセレクタ

引数を与えたいときは,makeObjectsPerformSelector:withObject:を使う.

使ってみる

こんな感じのクラスがあったとき,

Personクラス

  • 属性:height
  • メソッド:growUp(heightを1だけ増やす)
  • メソッド:growUpWithDifference:(heightを引数分増やす)

こんな感じでできる.

Person *ichiro = [[Person alloc] init];
Person *jiro = [[Person alloc] init];
Person *saburo = [[Person alloc] init];

NSArray *members = @[ichiro, jiro, saburo];

// 全員の身長が1cm伸びる
[members makeObjectsPerformSelector:@selector(growUp)];

// 全員の身長が10cm伸びる
// プリミティブ型は渡せないので変換する必要がある
[members makeObjectsPerformSelector:@selector(growUpWithDifference:) withObject:@(10)];


enumerateObjectsUsingBlock:ってのもあるんだけど,どっちを使うのがいいんだろうか.

適材適所なのかどうなのか.

それに,これって,mapだよね? たぶん.

*1:もっと実用的な例を考えるのが面倒だったとかそういうわけではない