浅析Objective-C字面量

编写Objective-C程序时,总会用到某几个类,它们属于Foundation框架。虽然从技术上来讲,不用Foundation框架也能写出Objective-C代码,但实际上却常常要用到此框架。这几个类是NSString、NSNumber、NSArray、NSDictionary。从类名上便可看出各自所表示的数据结构。
数组

Objective-C以语法繁杂而著称。事实上的确是这样。不过,从Objective-C 1.0起,有一种很是简单的方式能建立NSString对象。这就是“字符串字面量”(string literal),其语法以下:
NSString *someString = @”Effective Objective-C 2.0”; 安全

若是不用这种语法的话,就要以常见的alloc及init方法来分配并初始化NSString对象了。在版本较新的编译器中,也能用这种字面量语法来声明NSNumber、NSArray、NSDictionary类的实例。使用字面量语法(literal syntax)能够缩减源代码长度,使其更为易读。 数据结构

字面数值 app

有时须要把整数、浮点数、布尔值封入Objective-C对象中。这种状况下能够用NSNumber类,该类可处理多种类型的数值。如果不用字面量,那么就须要按下述方式建立实例:
NSNumber *someNumber = [NSNumber numberWithInt:1]; 框架

上面这行代码建立了一个数字,将其值设为整数1。然而使用字面量能令代码更为整洁:
NSNumber *someNumber = @1; spa

你们能够看到,字面量语法更为精简。不过它还有不少好处。可以以NSNumber实例表示的全部数据类型均可使用该语法。例如:
NSNumber intNumber = @1;
NSNumber 
floatNumber = @2.5f;

NSNumber doubleNumber = @3.14159;
NSNumber 
boolNumber = @YES;

NSNumber *charNumber = @’a’; 3d

字面量语法也适用于下述表达式:
对象

 

以字面量来表示数值十分有用。这样作能够令NSNumber对象变得整洁,由于声明中只包含数值,而没有多余的语法成分。blog

字面量数组ip

数组是经常使用的数据结构。若是不使用字面量语法,那么就要这样来建立数组:

 

 

而使用字面量语法来建立则是:

 

 

上面这种作法不只简单,并且还利于操做数组。数组的常见操做就是取某个下标所对应的对象,这用字面量来作更为容易。若是不用字面量,那么一般会用“objectAtIndex:”方法:

 

若使用字面量,则是:

 

这也叫作“取下标”操做(subscripting),与使用字面量语法的其余状况同样,这种方式也更为简洁、更易理解,并且与其余语言中依下标来访问数组元素时所用的语法相似。

不过,用字面量语法建立数组时要注意,若数组元素对象中有nil,则会抛出异常,由于字面量语法实际上只是一种“语法糖”(syntactic sugar),其效果等因而先建立了一个数组,而后把方括号内的全部对象都加到这个数组中。抛出的异常会是这样:

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

 

在改用字面量语法来建立数组时就会遇到这个问题。下面这段代码分别以两种语法建立数组:

1
2
3
4
5
6
7
id object1 = /* ... */;
id object2 = /* ... */;
id object3 = /* ... */;

NSArray *arrayA = [NSArray array WithObjects:
                       object1, object2, object3, nil];
NSArray *arrayB = @[object1, object2, object3];

 

你们想一想:若是object1与object3都指向了有效的Objective-C对象,而object2是nil,那么会出现什么状况呢?按字面量语法建立数组arrayB时会抛出异常。arrayA虽然能建立出来,可是其中却只含有object1一个对象。缘由在于,“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,因为object2是nil,因此该方法会提早结束。

这个微妙的差异代表,使用字面量语法更为安全。抛出异常令应用程序终止执行,这比建立好数组以后才发现元素个数少了要好。向数组中插入nil一般说明程序有错,而经过异常能够更快地发现这个错误。

字面量字典

“字典”(Dictionary)是一种映射型数据结构,可向其中添加键值对。与数组同样,Objective-C代码也常常用到字典。其建立方式以下:

 

这样写使人困惑,由于其顺序是<对象>,<键>,<对象>,<键>。这与一般理解的顺序相反,咱们通常认为是把“键”映射到“对象”。所以,这种写法不容易读懂。若是改用字面量语法,就清晰多了:

 

上面这种写法更简明,并且键出如今对象以前,理解起来较顺畅。此范例代码还说明了使用字面量数值的好处。字典中的对象和键必须都是Objective-C对象,因此不能把整数28直接放进去,而要将其封装在NSNumber实例中才行。使用字面量语法很容易就能作到这一点,只需给数字前加一个@字符便可。

与数组同样,用字面量语法建立字典时也有个问题,那就是一旦有值为nil,便会抛出异常。不过基于一样的缘由,这也是个好事。假如在建立字典时不当心用了空值对象,那么“dictionaryWithObjectsAndKeys:”方法就会在首个nil以前停下,并抛出异常,这有助于查错。

字典也能够像数组那样用字面量语法访问。按照特定键访问其值的传统作法是:

 

与之等效的字面量语法则是:

 

这样写也省去了冗赘的语法,令此行代码简单易读。

可变数组与字典

经过取下标操做,能够访问数组中某个下标或字典中某个键所对应的元素。若是数组与字典对象是可变的(mutable),那么也能经过下标修改其中的元素值。修改可变数组与字典内容的标准作法是:

 

若换用取下标操做来写,则是:

 

局限性

字面量语法有个小小的限制,就是除了字符串之外,所建立出来的对象必须属于Foundation框架才行。若是自定义了这些类的子类,则没法用字面量语法建立其对象。要想建立自定义子类的实例,必须采用“非字面量语法”(nonliteral syntax)。然而,因为NSArray、NSDictionary、NSNumber都是业已定型的“子族”(class cluster,参见第9条),所以不多有人会从其中自定义子类,真要那样作也比较麻烦。并且通常来讲,标准的实现已经很好了,无须再改动。建立字符串时可使用自定义的子类,然而必需要修改编译器的选项才行。除非你明白这样作的后果,不然不鼓励使用此选项,用NSString就足够了。

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

 

 

这么作会多调用一个方法,并且还要再建立一个对象,不过使用字面量语法所带来的好处仍是多于上述缺点的。

要点

应该使用字面量语法来建立字符串、数值、数组、字典。与建立此类对象的常规方法相比,这么作更加简明扼要。

应该经过取下标操做来访问数组下标或字典中的键所对应的元素。

 
用字面量语法建立数组或字典时,若值中有nil,则会抛出异常。所以,务必确保值里不含nil。
相关文章
相关标签/搜索