美文网首页iOS开发攻城狮的集散地程序员
OC字面量语法的使用以及优势

OC字面量语法的使用以及优势

作者: 翰霖啊 | 来源:发表于2018-09-03 10:58 被阅读74次

    OC的语法中有着一些语法简化的语法糖,例如项目中必定会多次用到NSString,NSNumber,NSArray,NSDictionary,这是Foundation框架中的一些常用类型,接下来聊一下这些类型适用的语法糖。

    NSNumber
    如果要把int,float,bool等封装到对象中就要用到NSNumber类型了,正常情况应该使用以下方式创建

    NSNumber *number = [NSNumber numberWithInt:1];
    

    这样的代码看起来也比较麻烦,冗长,那么使用字面量语法尝试下

    NSNumber *number = @1;
    

    这样看起来代码十分简洁,而且易读,而且其他类型也都可以使用字面量语法

    NSNumber *number = @1;            //int 型
    NSNumber *number = @1.5;         //float 型
    NSNumber *number = @YES;       //bool 型
    NSNumber *number = @'a';           //char 型
    

    同样也可以用作表达式,看起来会更加清晰,这里就不多做解释了,接下来看下一个数据类型。

    NSArray
    数据也是很常用的数据结构了,正常方式定义如下

    NSArray *array = [NSArray arrayWithObjects:@“first”,@“second”,@“third”,nil];
    

    同样下面换成字面量语法进行对比

    NSArray *array = @[@“first”,@“second”,@“third”];
    

    这样的好处一方面是看起来清晰,另一方面取值也更加方便了,不使用字面量语法取值为

    NSString *first = [array objectAtIndex:0];
    

    使用字面量语法取值

    NSString *first = array[0];
    

    这种操作为“取下标”操作,和其他语法的数组取值写法更加相似易懂。

    NSDictionary
    字典正常方式的创建十分麻烦,而且阅读起来也辛苦

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@“value1”,@“key1”,@“value2”,@“key2”,nil];
    

    字典本是key-value的形式出现,而创建的时候,是value-key的形式,所以阅读起来十分麻烦,而且容易出错,使用字面量语法可以完美避开这个问题

    NSDictionary *dict = @{@“key1”:@“value1”,@“key2”:@“value2”};
    

    不再需要没意义的代码,以最简单类似json的形式就可以创建好一个字典,而且里面的value也可以使用不同的其他类型,十分方便

    取值也分为正常取值和字面量语法取值

    NSString *value1 = [dict objectForKey:@“key1”];  //正常语法
    NSString *value1 = dict[@“key1”];                //字面量语法
    

    取值类似于数组的去下标的形式,只不过是通过key的方式查找,同样便利

    注意事项
    创建数组时,使用字面量语法和正常创建不完全相同,例如

    id object1 = /*…*/;
    id object2 = /*…*/;
    id object3 = /*…*/;
    NSArray *array1 = [NSArray arrayWithObjects:object1,object2,object3,nil];
    NSArray *array2 = @[object1,object2,object3];
    

    这里array1使用正常方式创建,array2使用字面量语法创建,假定object2为nil,那么array1会提前结束创建,相当于...object1,nil...,而array2会报错,因为这个语法糖效果相当于先创建了一个数组,然后将所有的对象都插入进来,报错信息如下
    [__NSPlaceholderArray initWithObjects:count:] attempt to insert nil object from objects[0]
    这样的好处是,在编译时会给我们提示,更加的安全,报错位置也更好找,避免项目进行中数据缺失造成难以定位的问题。
    同样字典遇到空的情况也会报类似的错。

    创建容器类可变对象
    创建可变数组或可变字典时一般需要先初始化开辟空间,否则无法添加对象

    NSMutableArray * mArray;
    [mArray addObject:@"object"];
    NSLog(@"%@", mArray);
    

    这样的输出并没有结果,原因是mArray并没有实际的空间,使用正常初始化方式为

    NSMutableArray * mArray = [[NSMutableArray alloc] init];
    

    这里也可以使用

    NSMutableArray * mArray = @[].mutableCopy;
    

    将空的不可变数组通过可变拷贝,变成可变数组,这也是一种初始化方式。
    字典的使用可以参考数组。
    本文部分内容参考自《effective+objective-c》一书,有兴趣的可以翻看一下

    相关文章

      网友评论

        本文标题:OC字面量语法的使用以及优势

        本文链接:https://www.haomeiwen.com/subject/wphbwftx.html