iOS高效编码之一----使用文字语法

在iOS开发过程中,NSString, NSArray, NSDictionary,NSNumber这几个类用的实在是非常多,以前的时候,都是用系统自带的方法使用这些类,后来发现有人习惯使用文字语法,一直觉得只是一种新的写法,没怎么关注,最近看了下,发现还是有很多好处。

一、NSNumber:

NSNumber *tempValue = [NSNumber numberWithInt:3];

新的语法是:

NSNumber *tempValue = @3;

对于这种,我们完全不需要区分变量究竟是int,还是float,亦或者是其它的数据类型,同时这样做,使得使用NSNumber对象更加清晰,因为大部分的声明是其代表的值而不是多余的语法。

二、NSArray

1、先看下面两种声明

//正常的语法
NSArray *normalArray = [NSArray arrayWithObjects:@"first", @"second", @"third", nil];
NSString *secondNormalString = [normalArray objectAtIndex:1];
//文字话语法
NSArray *literalArray = @[@"first", @"second", @"third"];
NSString *secondLiteralString = literalArray[1];
数组的生成,两者差不多,后者看起来要比前者清爽一点,简单一些(个人感觉),但是对于取数组中的元素,后者看起来和其它语言取数组元素很类似,更方便从其它语言转过来的人理解或者使用。

但是,如果你使用后者初始化一个数组的时候,要注意一点,那就是这个数组中的元素均不能为nil,否则,你就会收到一个形如下方的错误信息提示:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]'

举例如下:

id value1 = /*......*/;
id value2 = /*......*/;
id value3 = /*......*/;

NSArray *normalArray = [NSArray arrayWithObjects:value1, value2, value3, nil];
NSArray *literalArray = @[value1, value2, value3];

假如value2为nil,value1, value3不为nil,如果使用第一个方法初始化的话,normalArray将只包含一个元素(原因是因为arrayWithObjects:将会遍历参数列表,直到其遇到nil为止),这与我们的预期不符,而对于后者,在创建literalArray的时候将会直接抛出一个异常,导致app崩溃。

对于这一种情况,建议的是采用后者,因为针对这一种情况,后者相对来说更加安全,抛出一个异常,导致程序crash总比创建一个与预期元素个数不符的数组要好一些,因为前者更容易及时的呈现问题以及定位问题,而不是等到将来的某个时间点。

三、NSDictionary

两种字典的初始化方法如下:

NSDictionary *normalDic = [NSDictionary dictionaryWithObjectsAndKeys:@"firstValue", @"firstKey", @"secondValue", @"secondKey", nil];
NSDictionary *literalDic = @{@"firstKey":@"firstValue", @"secondKey":@"secondValue"};

对于前者,相信很多人都深有体会,当找某一个键值队的时候,总要慢慢的数,看看某个字段究竟是key,还是value,尤其是在这个字典键值对非常多的时候,更何况前者键值对展现形式还是<value>,<key>,<value>,<key>这种倒过来的顺序,读起来不轻松,但是对于后者,相信读起来会轻松很多,而且很容易找到每一个匹配的键值对

和数组一样,后者的写法中object不能为nil,否则也会抛出一个异常,导致程序crash。同样,使用前者,你会得到一个键值对个数与预期不符的数组,而后者则直接程序崩溃。优点和数组的优点一样,

取字典的某一个key对应的值

NSString *firstNormalValue = [normalDic objectForKey:@"firstKey"];
NSString *firstLiteralValue = literalDic[@"firstKey"];


修改字典的某一个key对应的value

NSMutableDictionary *normalMutableDic = [normalDic mutableCopy];
NSMutableDictionary *literalMutableDic = [literalDic mutableCopy];
[normalMutableDic setObject:@"newFirstValue" forKey:@"firstKey"];
literalMutableDic[@"firstKey"] = @"newFirstValue";

这也不能说是优点,个人观点,后者代码量少一些,看起来更轻松一些,更利于代码阅读


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值