相信对Swift有一定了解的人都知道它的下标语法.这个语法让类具备了像字典或者数组那样,利用下标获取一些东西的能力.但是,很多开发者或许不知道,OC中早就在Xcode4的时代,就已经有了这个语法.
OC中的对象下标语法
正如数组和字典, OC中的下标也分为了索引和键位.
索引下标需要声明和实现这两个方法:
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
键索引下标需要实现这两个方法:
- (id)objectForKeyedSubscript:(id <NSCopying>)key;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
这么说还是有些抽象, 现在来具体看个例子:
具体代码
@interface BlackBox : NSObject
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
- (id)objectForKeyedSubscript:(id <NSCopying>)key;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end
- (id)objectAtIndexedSubscript:(NSUInteger)idx{
//做各种逻辑构造返回对象
return @(idx);
}
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx{
}
- (id)objectForKeyedSubscript:(id <NSCopying>)key{
NSString *condition = (NSString*)key;
//做各种逻辑构造返回对象
return condition;
}
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key{
}
然后使用方法:
BlackBox *blackBox = [BlackBox new];
id object1 = blackBox[1];
id object2 = blackBox[@"all objects where value >= 100"];
使用场景
这个最好的感觉,就是封装细节.
现在比较火的路由,用这个方法去实现就比较好,例如:
routes[@"black module://rootController:23"] = ^(id param){
//逻辑代码
}
和方法的对比
然后这个用方法来实现,也是okay的啊,为啥要用这个下标呢? 个人感觉,本身,我们编程工作,很大一部分的内容就是命名.而这个命名也是很容易出问题的地方.而下标的方式,让我们可以省去这个步骤.很简单的一个例子:
array[10]
和 [array objectAtIndex:10]
你更愿意用哪个呢?