Effective Objective-C 2.0 — 第三条:多用字面量语法,少用与之等价的方法

第三条:多用字面量语法,少用与之等价的方法

几个类:NSString NSNumber NSArray NSDictionary

字面量语法是一种语法糖(syntactic sugar)

NSString *someString = @"字符串字面量";

字面量数值:

NSNumber *someNumber = @1; 等价与 NSNumber *someNumber = [NSNumber numberWithInt:1];

NSNumber *intNumber = @1;

int x = 5;

NSNumber *expressionNumber = @(x * y);

字面量数组:

如果不用字面量:NSArray *animals = [NSArray arrayWithObjects:@"cat", @"dog", @"mouse", @"badger", nil];

使用字面量语法:

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

//!若数组元素对象中有nil,使用字面量语法创建数组会抛出异常,语法糖效果等于先创建了一个数组,然后把方括号内的所有对象都加到这个数组中,抛出异常为:

'NSInavalidArgumentException' , reason:'.....attempt to insert nil object from objects[0]'

取某个下标对应的对象:(subscripting)

   不用字面量:

        NSString *dog = [animals objectAtIndex:1];

   使用字面量:

        NSString *dog = animals[1];

使用两种方法创建数组,其中object2为nil

id object1 = /*...*/; id object2 = /*....*/; id object3 = /*...*/;

NSArray *arrayA = [NSArray arrayWithObjects:object1, object2, object3, nil];

NSArray *arrayB = @[object1, object2, object3];

分析:arrayA只能创建object1 对象来,因为“arrayWithObject:“方法遇到nil会结束

   arrayB会抛出异常,so使用字面量语法更为安全,可以发现错误

字面量字典

  Dictionary ,映射型数据结构,键值对

NSDictionary *personData = [NSDictionarydictionaryWithObjectsAndKeys:

                @"Matt", @"firstName",

                @"Galloway", @"lastName",

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

                 nil];

顺序是 《对象》,《键》 与

通常理解为 把“键”映射到“对象”,相反

字面量: NSDictionary *personData = @{@"firstName" : @"Matt",

                     @"lastName" : @"Galloway",

                     @"age" : @28};

28区别原因:字典中的对象和键必须都是Objective-C对象,所以不能把28直接放进去,而要封装在NSNumber实例中才行

由键访问其值 : 不用字面量: NSString *lastNamge = [personData objectForKey:@"lastName"];

        使用字面量:NSString *lastName = personData[@"lastName"];

可变数组与字典:

修改可变数组与字典内容的标准做法是:

  [mutableArray replaceObjectAtIndex:1 withObject:@"dog"];

  [mutableDictionary setObject:@"Galloway"forKey:@"lastName"];

换成去下标:

  mutableArray[1] = @"dog";

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

局限性:

  除了字符串以外,所创建出来的对象必须属于Foundation框架。

  使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)   

  想要可变版本的对象,需复制一份:NSMutableArray *mutable = [@[@1, @2, @3]mutableCopy];