Objective-Cのメソッドはラベル名/プロパティー名を省略することが可能です。
これにより以下の様なシンプルな記法を実現出来ます。
[@"a_b_c" replaceAll:@"_" :@"-"]; // "a-b-c"
[@"abc" substr:1 :2]; // "bc"
作り方
@interface NSString (MaryCore)
- (NSString *)replaceAll:(NSString *)target :(NSString *)replacement;
- (NSString *)substr:(NSUInteger)loc :(NSUInteger)len;
@end
@implementation NSString (MaryCore)
- (NSString *)replaceAll:(NSString *)target :(NSString *)replacement {
return [self stringByReplacingOccurrencesOfString:target withString:replacement];
}
- (NSString *)substr:(NSUInteger)loc :(NSUInteger)len {
return [self substringWithRange:NSMakeRange(loc, len)]
}
@end
セレクター経由でメソッドを呼び出す場合は、SEL側も同様にラベル名を省略した形で呼び出します。
// SEL sel = NSSelectorFromString(@"replaceAll::");
SEL sel = @selector(replaceAll::);
id ret = [@"a" performSelector:sel withObject:@"_" withObject:@"-"];
注意
Apple側のライブラリではこのラベル省略の技法は用いられていませんので、あまり推奨できる書き方ではないかもしれません。リファクタリング機能も若干効きづらいケース(主にEdit All in Scope)があるため、ダークサイ度は★3つとします。
いずれにしろ、セレクターの裏をかいた面白いテクニックと言えるでしょう。Objective-Cをより好きになる面白い仕様だと思います。
私「Objective-Cかわいいよ・・・、Objective-C・・・」
Objective-C「ちょっとやだこっち来ないで!!」
ピンバック: 無名メソッドを作成する【ダークサイドObjective-C】 | MaryCore