如你所知,苹果已经为NSNumber,NSDictionary,NSArray等类提供了@文字,所以我们可以这样创建一个对象,例如
NSArray *array = @[obj1, obj2];所以我想知道,是否有一种方法可以为我自己的类创建这样的文字?例如,我想编写smth。喜欢
MyClass *object = MyClass[value1, value2];我不想写很长的解析器:)
发布于 2013-07-18 16:56:32
Clang编译器的特点是@语法是字面量。因为它的编译器特性,NO,你不能定义你自己的文字。
有关编译器文字的更多信息,请参阅Clang 3.4 documentation - Objective-C Literals
编辑:另外,我发现this很有趣,所以讨论一下
编辑:正如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"]);发布于 2015-07-17 17:29:46
你对这个语法没意见吗?
MyClass *object = MyClass(value1, value2);只需像这样定义宏:
#define MyClass(objects...) [[MyClass alloc] initWithObjects: @[objects]];编译器将允许命名为MyClass 和 MyClass()宏的类。
https://stackoverflow.com/questions/17718790
复制相似问题