@
構文はリテラルであり、これはClang
コンパイラの機能です。そのコンパイラ機能NOにより、独自のリテラルを定義することはできません。
コンパイラ リテラルの詳細については、Clang 3.4 ドキュメント - Objective-C Literalsを参照してください。
編集:また、私はこの興味深いSOディスカッションを見つけました
編集: BooRanger がコメントで述べたように、カスタム オブジェクトにアクセスするため[]
のアクセサー (方法)を作成する方法が存在します。Collection Literals
と呼ばれObject Subscripting
ます。これを使用すると、このようにカスタム クラス内のあらゆるものにアクセスできますmyObject[@"someKey"]
。NSHipsterで詳細をお読みください。
「Subcriptable」オブジェクトの実装例を次に示します。簡単に言えば、内部辞書にアクセスするだけです。ヘッダ:
@interface LKSubscriptableObject : NSObject
// Object subscripting
- (id)objectForKeyedSubscript:(id <NSCopying>)key;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end
実装:
@implementation LKSubscriptableObject {
NSMutableDictionary *_dictionary;
}
- (id)init
{
self = [super init];
if (self) {
_dictionary = [NSMutableDictionary dictionary];
}
return self;
}
- (id)objectForKeyedSubscript:(id <NSCopying>)key
{
return _dictionary[key];
}
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key
{
_dictionary[key] = obj;
}
@end
角かっこを使用するだけで、このオブジェクト内のすべてにアクセスできます。
LKSubscriptableObject *subsObj = [[LKSubscriptableObject alloc] init];
subsObj[@"string"] = @"Value 1";
subsObj[@"number"] = @2;
subsObj[@"array"] = @[@"Arr1", @"Arr2", @"Arr3"];
NSLog(@"String: %@", subsObj[@"string"]);
NSLog(@"Number: %@", subsObj[@"number"]);
NSLog(@"Array: %@", subsObj[@"array"]);