我自己的@ {}文字

时间:2013-07-18 08:49:50

标签: objective-c customization

如你所知Apple为NSNumber,NSDictionary,NSArray等类提供了@ literals,所以我们可以用这种方式创建一个对象,例如

NSArray *array = @[obj1, obj2];

所以我想知道,如果有办法为我自己的类创建这样的文字?例如,我想写smth。喜欢

MyClass *object = MyClass[value1, value2];

而且我不想写长解析器:)

2 个答案:

答案 0 :(得分:2)

@语法是文字,它是Clang编译器的特征。由于其编译器功能 NO ,您无法定义自己的文字。

有关编译器文字的更多信息,请参阅Clang 3.4 documentation - Objective-C Literals

编辑:另外,我刚刚发现this有趣的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"]);

答案 1 :(得分:1)

你对这种语法没问题吗?

MyClass *object = MyClass(value1, value2);

只需像这样定义宏:

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

编译器将允许名为MyClass MyClass()宏的类。