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