使用OC中字面量语法,可以快速得到一个对象.看着清晰,用着也便捷,何乐而不为.
- 字面数值
有时候,需要把整数,浮点数,布尔值封装进一个objective-C对象中. 这时候需要用NSNumber类.通过类名就可以知道,该类是处理"数值"的类.什么int,long,float,,double ,char,bool 等都可以.
一般我们可以这么用:
NSNumber* someNumber = [NSNumber numberWithInt:1];
NSNumber* floatNumber = [NSNumber numberWithFloat:3.5];
推荐这样用
NSNumber* someNumber =@1;
NSNumber* floatNumber =@3.5f;
//还可以这样
NSNumber* doubleNumber = @3.1415926;
NSNumber* boolNumber = @YES;
NSNumber* charNumber = @'a';
- 字面量数组
数组是常用的数据结构,如果不使用字面量语法.
一般我们可以这样创建一个数组
NSArray* animals = [NSArray arrayWithObjects:@"cat",@"dog",@"mouse",@"tiger",nil ];
推荐这样
NSArray* animals = @[@"cat",@"dog",@"mouse",@"tiger"];
从数组中取出元素
//可以当C数组一样的用
NSString* cat = animals[0];
//NSString* cat =[animals objectAtIndex:0];
- 字面量字典
字典几乎是主流生产型语言,都有的结构. 其实就是一种哈希结构,是一种映射型的数据结构.这货比较厉害,想要什么只要给它一个key,就可以返回一个该key对应的Value,你会说,数组不也能做到吗?可它插入效率比数组高.总之,用的时候记住一个公式就可以. Value = f(Key); 就是"键","值"对.
对的,用起来就这么简单,底层都帮你封装好了,你不用担心怎么查找,怎么添加,删除元素.
一般我们使用NSDictionary提供的类方法,或者便利方法初始化方法来创建一个我们想要的字典对象.
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:Value1,@"key1",Value2,@"key2",nil];
//就这么别扭:一个"对象",一个"键".最后为空.
字面量创建
NSDictionary* dict =@{@"key1",Value1,@"key2",Value2};
//这样就清晰多了. 键:对象
读取字典
NSInteger longValue = 3;
NSString* stringObject = @"object";
NSDictionary* dict = @{[NSNumber numberWithInteger:longValue]:@"longValue",stringObject:@"object"};
//使用对象方法
stringObject = [dict objectForKey:@"object"];
//使用字面量语法
stringObject = dict[@"object"];
注意:字典里面只能是对象.如果是int,NSInteger,CGFloat,之类的,统统要转换成NSNumber对象才可以.同理数组也是这样.
- 字面量语法的语法糖(syntactic suger)与局限性:
- 语法糖就是计算机语言中与另外一套语法等效但是开发者用起来却更加方便的语法.语法糖可令程序更加易读,减少代码出错机率.
- 局限性:第1个局限性是,通过字面量语法生成的对象都是Foundation框架里的对象.自定义不可使用字面量语法创建对象. 第2个局限性是,使用字面量语法时,数组或者字典中元素不可以为空(nil).使用方法创建数组或者字典对象则可以允许元素为空.原因在于:方法会一次处理各个参数,知道发现nil位置.
例
//使用类方法创建数组对象
NSArray* arrayA = [Array arrayWithObjects:object1,object2,object3,nil];
//使用字面量语法创建对象
NSArray* arrayB = @[object1,object2,object3];
上例中:如果object2为nil,那么,arrayA虽然能创建成功,但是其中却只含有object1一个对象.原因在于:方法会一次处理各个参数,知道发现nil位置.arrayB会直接抛出异常.可见虽然,方法创建虽然可以帮我们避免nil报出异常(结果可能不是我们想要的). 字面量语法可以帮我们检查异常. 推荐使用字面量语法,如果有特殊需求使用[NSNull null]代替.
2018-02-08 15:19:44.095282+0800 数组[87788:4305271] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'
上班时间,忽然遇到坑了,翻了翻书, 顺便记录一下.
- 参考:<<Effective Objective- C>>