Objective Cのいくつかの冷たい門の黒い科学技術

2833 ワード

- (id)valueForKeyPath:(NSString *)keyPathの方法についてよく知られていないかもしれません.
実はこの方法は非常に強力で、例を挙げます.
NSArray *array = @[@"name", @"w", @"aa", @"jimsa"];
NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);
  
(
   NAME,
   W,
   AA,
   JIMSA
)

配列に相当する各メンバーはuppercaseStringメソッドを実行し、返されたオブジェクトを新しい配列に戻します.uppercaseStringメソッドが使用できる以上、NSStringの他のメソッドも使用できます.例えば、[array valueForKeyPath:@"length"]
各文字列の長さの配列を返します.あなたが考えることができるメンバーのインスタンス方法さえあれば、このように使用することができます.
この方法がこれだけ機能していると思ったら、間違っています.具体例を挙げると
NSNumber配列の配列合計、平均、最大値、最小値の高速計算
NSArray *array = @[@1, @2, @3, @4, @10];
NSNumber *sum = [array valueForKeyPath:@"@sum.self"];
NSNumber *avg = [array valueForKeyPath:@"@avg.self"];
NSNumber *max = [array valueForKeyPath:@"@max.self"]; 
NSNumber *min = [array valueForKeyPath:@"@min.self"];

または出力タイプの指定
   NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"];
  NSNumber *avg = [array valueForKeyPath:@"@avg.floatValue"];
   NSNumber *max = [array valueForKeyPath:@"@max.floatValue"];
   NSNumber *min = [array valueForKeyPath:@"@min.floatValue"];

重複除外
NSArray *array = @[@"name", @"w", @"aa", @"jimsa", @"aa"];

NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.self"]);
  
(
name,
w,
jimsa,
aa
)

NSDictionary配列に対して対応するkeyペアの値をすばやく見つける
NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1},
                         @{@"name": @"jim",@"code" : @2},
                         @{@"name": @"jim",@"code" : @1},
                         @{@"name": @"jbos",@"code" : @1}];
NSLog(@"%@", [array valueForKeyPath:@"name"]);

辞書のnamekeyに対応する値からなる配列を直接得ることは,ループ値よりも新しい配列に加わるほうが便利で速いことが明らかである(cookeee,jim,jim,jbos)
同様にネストして使用し、name対応値の重複データを除去してから値を取ることができます.
NSArray *array = @[@{@"name" : @"cookeee",@"code" : @1},
                         @{@"name": @"jim",@"code" : @2},
                          @{@"name": @"jim",@"code" : @1},
                         @{@"name": @"jbos",@"code" : @1}]; NSLog(@"%@", [array valueForKeyPath:@"@distinctUnionOfObjects.name"]);

  
(
cookeee,
jim,
jbos
)

UItextfiedlのplaceholderの色を変更
[searchField setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
- (void)drawPlaceholderInRect:(CGRect)rect;を書き直すよりずっと便利です