Effective OC (1) 多用字面量语法,少用与之等价的方法

Objective-C 以语法繁杂而著称。事实上的确是这样。不过,从Objective-C 1.0起,有一种非常简单的方法能创建NSString对象。这就是“字符串字面量”(string literal),其语法如下:

NSString *something = @"Effective objective c ";

如果不用这种语法的话,就要以常见的alloc及init方法来分配初始化NSString对象了。在后续的迭代的编译器版本中,也能用这种字面量语法来声明NSNumber、NSArray、NSDictionary类的实例。使用字面量语法可以缩减代码长度,使其更为易读。

字面数值

    一般需要把整数、浮点数、布尔值封入OC对象中,需要使用NSNumber类,需要如下创建实例:

NSNumber *someNumber = [NSNumber numberWithInt:1];

也可以用字面量语法

NSNumber *someNumber = @1;

易见,字面量语法更加简洁。不过他还有很多好处。能够以NSNumber实例表示所有数据类型。

NSNumber *intNumber = @1;

NSNumber *floatNumber = @2.5f;

NSNumber *doubleNumber = @3.1415926;

NSNumber *boolNumber = @YES;

NSNumber *charNumber = @'a';

这样做可以令NSNumber对象变得简洁,因为声明中只包含数值,而没有多余的语法成分。

字面量数组

数组是常用的数据结构,如果不用字面量语法,那么就要这样创建数组:

NSArray *animals = [NSArray arrayWithObjects:@"cat",@"dog",@"mouse",@"badger",nil];

而用字面量语法创建则是:

NSArray *animals = @[@"cat",@"dog",@"mouse",@"badger",nil];

上面这种语法不仅简单,而且有利于操作数组。操作数组最常见的操作就是取某个下标所对应的对象,这用字面量语法也更容易。如果不用字面量语法,通常会用“objectAtIndex:”方法:

NSString *dog = [animals objectAtIndex:1];

若使用字面量语法:

NSString * dog = animals[1];

这也叫做“取下标”操作(subscripting),与使用字面量语法一样,这种方法更为简洁、更易理解。

我们来看下这个例子:

NSArray *arrayA = [NSArray arrayWithObject:Object1,Object2,Object3];

NSArray *arrayB = @[@"Object1",@"Object2",@"Object3"];

大家想想:如果Object1,Object3都指向了有效的Objective-C对象,而Object2是nil,那么会出现什么情况呢?

按字面量语法创建数组arrayB会抛出异常。arrayA虽然能创建出来,但是只有一个Object1对象。原因在于“arrayWithObject”方法会依次处理各个参数,直到发现nil为止,由于Object2为nil,所以该方法会提前结束。

这个微妙差别表明,使用字面量语法更为安全。


字面量字典

字典是一种映射的数据结构,在Objective-C中创建方式如下,

NSDictionary *personData = [NSDictionary dictionaryWithObjectAndKeys:

                                               @"Matt",@"firstName",

                                               @"Gall",@"lastName",

                                               @"[NSNumber numberWithInt:28]",@"age"];

这样写令人困惑,因为其顺序是<对象>,<键>,<对象>,<键>。这与通常理解的顺序相反。如果改成字面量语法,就明显易懂多了。

NSDictionary *personData = @{@"firstName":@"Matt",

                                                @"lastName":@"Gall",

                                                @"age":@28};

上面这种写法更简明,而且键出现在对象前面,理解起来更为顺畅。此范例还说明额字面量数值的好处,字典对象和键都必须是对象,所以整数28不能直接放入,必须封装成NSNumber才行,而字面量语法很容易做到这一点只需加一个@即可。

与数组一样,用字面量语法创建字典时也有一个问题,那就是遇到nil就会抛出异常,不过这也是个好事。帮助我们在编写代码时及时发现问题,而不用等编译好才发现。


可变数组与字典

通过取下标操作,可以访问数组某个下标或字典中某个键值对对应的对象。如果数组或字典是可变的(mutable),那么也能通过下标修改其中元素值。

mutableArray[1] = @"dog";

mutableDictionary[@"lastName"] = @"Gall";

局限性

1)字面量语法有个小小的限制,就是除了字符串以外,所创建出来的对象必须属于Foundation框架。

2)是用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。若想要变成可变的需要复制一份:

NSMutableArray *mutable = [@[@1,@2,@3,@4,@5]mutableCopy];

这么做虽然会多调用一个方法,而且多创建一个对象,不过使用字面量语法所带来的好处还是多于上述缺点的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容