2

ご存じのとおり、Apple は NSNumber、NSDictionary、NSArray などのクラスに @ リテラルを提供しているため、この方法でオブジェクトを作成できます。たとえば、

NSArray *array = @[obj1, obj2];

だから、自分のクラスにそのようなリテラルを作成する方法があるのだろうか? たとえば、smth を書きたいとします。お気に入り

MyClass *object = MyClass[value1, value2];

そして、私は長いパーサーを書きたくありません:)

4

2 に答える 2

2

@構文はリテラルであり、これは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"]);
于 2013-07-18T08:56:31.587 に答える
1

この構文でよろしいですか?

MyClass *object = MyClass(value1, value2);

次のようにマクロを定義するだけです。

#define MyClass(objects...) [[MyClass alloc] initWithObjects: @[objects]];

コンパイラは、名前付きクラスMyClass MyClass()マクロを許可します。

于 2015-07-17T09:29:45.673 に答える