3多用字面量语法,少用与之等价的方法
Posted 码出境界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3多用字面量语法,少用与之等价的方法相关的知识,希望对你有一定的参考价值。
1、字面字符串
摒弃:
NSString *someString = [[NSString alloc] initWithString: @"Effective Objective-C 2.0"];
提倡:
NSString *someString = @"Effective Objective-C 2.0";
2、字面数值
摒弃:
NSNumber *someNumber = [NSNumber numberWithInt: 1];
提倡:
NSNumber *intNumber = @1;
NSNumber *floatNumber = @2.5f;
NSNumber *doubleNumber = @3.14159;
NSNumber *boolNumber = @YES;
NSNumber *charNumber = @‘a’;
亦可以
int x = 5;
float y = 6.32f;
NSNumber *expressionNumber = @(x * y);
3、字面量数组
摒弃:
NSArray *animals = [NSArray arrayWithObjects: @“cat”, @“dog”, @“mouse”, @“badger”, nil];
NSString *dog = [animals objectAtIndex: 1];
提倡:
NSArray *animals = @[@“cat”, @“dog”, @“mouse”, @“badger”];
NSString *dog = animals[1];
提示:
“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止。而字面量语法创建时如果有nil,则会抛出异常。这个微妙的差别表明,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比创建好数组之后才发现元素个数少了要好。
4、字面量字典
摒弃:
NSDictionary *personData = [NSDictionary dictionaryWithObjectsAndKeys: @“Matt”, @“firstName”, @“Galloway”, @“lastName”, [NSNumber numberWithInt: 28], @“age”, nil];
NSString *lastName = [personData objectForKey: @“lastName"];
提倡:
NSDictionary *personData = @{@“firstName” : @“Matt”, @“lastName” : @“Galloway”, @“age” : @28}:
NSString *lastName = personData[@“lastName"];
提示:
跟字面量数组类似。
5、可变数组与字典
摒弃:
[animals replaceObjectAtIndex: 1 withObject: @“dog”];
[personData setObject: @“Jon” forKey: @“lastName”];
推荐:
animals[1] = @“dog";
personData[@“lastName”] = @“Jon”;
6、局限性
字面量语法有个小小的限制,就是除字符串之外,所创建出来的对象必须属于Foundation框架才行。如果自定义了这些类的子类,则无法用字面量语法创建其对象。要创建自定义子类的实例,必须采用“非字面量语法”。然而,由于NSArray、NSDictionary、NSNumber都是业已定型的“子类”,因此很少有人会从其中自定义子类,真要这样做也比较麻烦。而且一般来说,标准的实现已经很好了,无须再改动。
创建字符串时可以使用自定义的子类,然而必须要修改编译器的选项才行。除非你明白这样做的后果,否则不鼓励使用此选项,用NSString就足够了。
使用字面量语法创建出来的字符串、数组、字典对象都是不可变的。若想要可变版本的对象,则需要复制一份mutableCopy。这么做会多调一个方法,而且还要再创建一个对象,不过使用字面量语法所带来的好处还是多于上述缺点的。
以上是关于3多用字面量语法,少用与之等价的方法的主要内容,如果未能解决你的问题,请参考以下文章