OC语法糖总结-@[],@{},@()

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。实际上没有对代码功能没有影响,但是增强我们程序的可读性”的语法。

1.枚举绑定数据类型

    enum {  
        ObjectiveC,  
        Java,  
        Ruby,  
        Python,  
        Erlang  
    };  
    typedef NSUInteger Language; 
    // 

2.点语法。OC里面所有的点语法都是。

3.属性的@synthesize,我们知道现在连@synthesize也可以省略了,那就是说@property本身已经连带使用了语法糖。

4.语法简化
4.1 NSNumber

NSNumber *value;  
value = @12345;  
value = @123.45f;  
value = @123.45;  
value = @YES;  

4.2 NSArray

NSArray *array;  
array = @[];               //空数组  
array = @[ a ];           //一个对象的数组  
array = @[ a, b, c ];   //多个对象的数组  
@[]只能是不可变数组, 可变数组NSMutableArray *mutablePlanets = [@[ a, b, c ] mutableCopy]; 
//

4.3 NSDictionary

NSDictionary *dict;  
dict = @{};     //空字典  
dict = @{ @"a" : a };     //包含一个键值对的字典  
dict = @{ @"b" : b, @"c" : c, @"d" : d };   //包含多个键值对的字典
//@{}只能是不可变字典, 可变字典NSMutableDictionary *dic = [@{ @"b" : b}mutableCopy];     
//

5.对象下标
可以通过下标方式存取数组和字典的数据,类似C语言结构
5.1 NSArray

NSArray *array = @[ a, b, c ];  
id obj = array[i];     //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];  
array[i] = newObj;     //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i withObject:newObj];  
//

5.2 NSDictionary

NSDictionary *dict = @{ @"b" : b, @"c" : c, @"d" : d  };  
id obj = dict[@"b"];     //获取o2对象,替换原有写法:[dic objectForKey:@"b"];  
dic[@"c"] = newObj;  //重新为键为@"c"的对象赋值,替换原有写法:[dic setObject:newObj forKey:@"c"]  
//

6.@()用法
在 Objective-C 中我们可以用 @“foo” 来创建一个 NSString 常量,看起来似乎平淡无奇。
但它背后其实比想象的精彩,@ 可以被理解成一个特殊的宏,其接受一个 C 字符串作为参数,也可写作 @(“foo”)。
之所以说 @ 是一个特殊的宏,是因为其能根据传入的 C 字符串类型不同——C 字符串常量或 C 字符串——在运行时构建返回不同类型的 NSString,参见下面的代码:

char* obtain_c_string(void)
{
 return "c_string";
}
NSLog(@"%@", @"foo".class);
NSLog(@"%@", @("bar").class);
NSLog(@"%@", @(obtain_c_string()).class);
NSLog(@"%@",@"aaa");
NSLog(@"%@",@("aaa"));

输出结果:

 __NSCFConstantString
 __NSCFConstantString
 __NSCFString
 aaa
 aaa

可见,如果传入的是 C 字符串常量,运行时构建的则为 NSConstantString;如果传入的是 C 字符串则创建的是 NSString。

众所周知,Objective-C 代码里有很多地方需要我们把代码中的一些文法串写成字符串再作为传入参数,比如 KVO 中的 keyPath 参数往往就要传入形如 propertyA.propertyB 的字符串,从实用角度出发这有两个弊端:
写字符串的时候没有代码提示,很容易写错
即便一开始写对了,如果后来相关类重构了,keyPath 的参数便失效了,而 Xcode Refactor 无法扫描字符串
当我们理解了 @(),再加上自定义的宏,上述两个问题便可迎刃而解。

/**
 * # 将宏的参数字符串化,C 函数 strchr 返回字符串中第一个 '.' 字符的位置
 */
 #define Keypath(keypath) (strchr(#keypath, '.') + 1)
// 有代码提示,可以被重构扫描到
[objA addObserver: objB forKeyPath: @Keypath(ObjA.property1.property2) options: nil context: nil];
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值