OC的语法中有着一些语法简化的语法糖,例如项目中必定会多次用到NSString,NSNumber,NSArray,NSDictionary,这是Foundation框架中的一些常用类型,接下来聊一下这些类型适用的语法糖。
NSNumber
如果要把int,float,bool等封装到对象中就要用到NSNumber类型了,正常情况应该使用以下方式创建
NSNumber *number = [NSNumber numberWithInt:1];
这样的代码看起来也比较麻烦,冗长,那么使用字面量语法尝试下
NSNumber *number = @1;
这样看起来代码十分简洁,而且易读,而且其他类型也都可以使用字面量语法
NSNumber *number = @1; //int 型
NSNumber *number = @1.5; //float 型
NSNumber *number = @YES; //bool 型
NSNumber *number = @'a'; //char 型
同样也可以用作表达式,看起来会更加清晰,这里就不多做解释了,接下来看下一个数据类型。
NSArray
数据也是很常用的数据结构了,正常方式定义如下
NSArray *array = [NSArray arrayWithObjects:@“first”,@“second”,@“third”,nil];
同样下面换成字面量语法进行对比
NSArray *array = @[@“first”,@“second”,@“third”];
这样的好处一方面是看起来清晰,另一方面取值也更加方便了,不使用字面量语法取值为
NSString *first = [array objectAtIndex:0];
使用字面量语法取值
NSString *first = array[0];
这种操作为“取下标”操作,和其他语法的数组取值写法更加相似易懂。
NSDictionary
字典正常方式的创建十分麻烦,而且阅读起来也辛苦
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@“value1”,@“key1”,@“value2”,@“key2”,nil];
字典本是key-value的形式出现,而创建的时候,是value-key的形式,所以阅读起来十分麻烦,而且容易出错,使用字面量语法可以完美避开这个问题
NSDictionary *dict = @{@“key1”:@“value1”,@“key2”:@“value2”};
不再需要没意义的代码,以最简单类似json的形式就可以创建好一个字典,而且里面的value也可以使用不同的其他类型,十分方便
取值也分为正常取值和字面量语法取值
NSString *value1 = [dict objectForKey:@“key1”]; //正常语法
NSString *value1 = dict[@“key1”]; //字面量语法
取值类似于数组的去下标的形式,只不过是通过key的方式查找,同样便利
注意事项
创建数组时,使用字面量语法和正常创建不完全相同,例如
id object1 = /*…*/;
id object2 = /*…*/;
id object3 = /*…*/;
NSArray *array1 = [NSArray arrayWithObjects:object1,object2,object3,nil];
NSArray *array2 = @[object1,object2,object3];
这里array1使用正常方式创建,array2使用字面量语法创建,假定object2为nil,那么array1会提前结束创建,相当于...object1,nil...,而array2会报错,因为这个语法糖效果相当于先创建了一个数组,然后将所有的对象都插入进来,报错信息如下
[__NSPlaceholderArray initWithObjects:count:] attempt to insert nil object from objects[0]
这样的好处是,在编译时会给我们提示,更加的安全,报错位置也更好找,避免项目进行中数据缺失造成难以定位的问题。
同样字典遇到空的情况也会报类似的错。
创建容器类可变对象
创建可变数组或可变字典时一般需要先初始化开辟空间,否则无法添加对象
NSMutableArray * mArray;
[mArray addObject:@"object"];
NSLog(@"%@", mArray);
这样的输出并没有结果,原因是mArray并没有实际的空间,使用正常初始化方式为
NSMutableArray * mArray = [[NSMutableArray alloc] init];
这里也可以使用
NSMutableArray * mArray = @[].mutableCopy;
将空的不可变数组通过可变拷贝,变成可变数组,这也是一种初始化方式。
字典的使用可以参考数组。
本文部分内容参考自《effective+objective-c》一书,有兴趣的可以翻看一下
网友评论