zoukankan      html  css  js  c++  java
  • iOS @字面量

    通常我们会用alloc和init方法来分配并初始化NSString对象,“字符串字面量”(string literal)提供了一种非常简单的方式创建 NSString对象,语法如下:

    NSString *str=@"String Literal Learning";

    当然也可以用字面量语法来声明NSNumber、NSArray、NSDictionary类的实例。

    字面量字符串和NSNumber:

    例如NSNumber类,该类可以处理多种类型的数值,如果不用字面量,通常我们是这样来创建实例的:

    NSNumber *num=[NSNumber numberWithInt:1];

    这行代码创建了一个数字,并将其值设为整数1。那么使用字面量呢,我们来看看:

    NSNumber *num=@1;

    感觉到区别了吧!字面量语法更为简洁。能够以NSNumber实例表示的所有数据类型都可以使用该语法。如:

    NSNumber *intNumber=@1;

    NSNumber *floatNumber=@2.5f;

    NSNumber *doubleNumber=@3.1415926;

    NSNumber *boolNumber=@YES;

    NSNumber *charNumber=@'a';

    除此之外,字面量语法还可用于表达式:

    int x=2;

    float y=2.5f;

    NSNumber *expressionNumber=@(x * y);

    字面量数组:

    数组是一种很常见的数据结构,通常我们是这样来创建数组的:

    NSArray *fruits=[NSArray arrayWithObjects:@"apple",@"orange",@"banana",@"watermelon",nil];

    字面量语法则是:

    NSArray *fruits=@[@"apple",@"orange",@"banana",@"watermelon"];

    这种字面量做法不仅简单,而且有利于操作数组,比如数组常见的"取下标"操作(subscripting),如果不用字面量,则通常会用“objectAtIndex:”方法:

    NSString *orange=[fruits objectAtIndex:1];

    若使用字面量的话,则是:

    NSString *orange=fruits[1];

    很明显,这种方式更为简洁、更容易理解,而且与其他语言中依下标来访问数组元素时所用的语法类似。

    但是,如果数组元素对象中有nil,那么使用字面量语法创建的数组就会抛出异常。例如现在有三个对象:

    id object1=/*...*/;

    id object2=/*...*/;

    id object3=/*...*/;

    分别以两种语法创建数组:

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

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

    现在假设object1和object3都是有效的OC对象,而object2是nil,那么按字面量语法创建的数组arrayB时就会抛出异常,而arrayA虽然能创建成功,但却只含有object1一个对象,因为“arrayWithObjects:”方法会依次处理各个参数,直到发现nil为止,由于object2是nil,所以该方法会提前结束。这个微妙的差别表明,使用字面量语法更为安全,抛出异常令程序终止,总比创建还数组之后才发现元素个数少了更好。向数组中插入nil通常是说明程序有错,通过异常可以使我们更快地发现这个错误。

    字面量字典:

    “字典”(Dictionary)是一种映射型数据结构,可向其中添加键值对。OC中字典的创建方式如下:

    NSDictionary *personData=[NSDictionary dictionaryWithObjectsAndKeys:@"Matt",@"firstName",@"Galloway",@"lastName",[NSNumber numberWithInt:28],@"age",nil];

    这样的<对象>,<键>,<对象>,<键>写法是不是很困惑?!来看看字面量的写法吧:

    NSDictionary *persinData=@{@"firstName":@"Matt",@"lastName":@"Galloway",@"age":@28};

    好理解多了吧!字典中的键和对象都必须是OC对像,所以整数28需要封装在NSNumber实例中。和数组一样,用字面量语法创建字典时,一旦有值为nil,就会抛出异常,同理,这也有助于我们查错。

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

    NSString *lastName=[personData objectForKey:@"lastName"];

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

    NSString *lastName=personData[@"lastName"];

    可以看到,这样写省去了冗赘的语法,使代码简单易懂。

    可变数组与字典:

    如果数组和字典对象是可变的(mutable),那么也可以通过下标修改其中的元素值。修改可变数组和字典内容的标准做法是:

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

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

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

    mutableArray[1]=@"orange";

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

    说了这么多字面量语法的好处,但是人无完人嘛,字面量语法又个小小的限制,即除了字符串以外,所创建出来的对象必须属于Foundation框架才行。如果自定义了这些类的子类,则无法用字面量语法创建其对象。另外,使用字面量语法创建出来的字符串、数组、字典对象都是不可变的(immutable)。如果想可变版本的对象,则需要复制一份:

    NSMutableArray *mutable=[@[@1,@2,@3,@4,@5]mutableCopy];

    这么做会多调用一个方法,而且还要再创建一个对象,不过使用字面量语法所带来的好处还是多于其缺点的。

    详情可参考书籍:Effective Objective-C 2.0

  • 相关阅读:
    [LC] 71. Simplify Path
    [LC] 225. Implement Stack using Queues
    [Coding Made Simple / LeetCode 1235] Maximum Profit in Job Scheduling
    [Coding Made Simple] Cutting Rod for max profit
    [Coding Made Simple] Longest Common Substring
    [GeeksForGeeks] Convert an array to reduced form
    [GeeksForGeeks] Find if there is a pair with a given sum in a sorted and rotated array.
    [Coding Made Simple] Optimal Binary Search Tree
    [GeeksForGeeks] Write a program to delete a tree
    [GeeksForGeeks] Check if two trees are Isomorphic
  • 原文地址:https://www.cnblogs.com/saytome/p/8078921.html
Copyright © 2011-2022 走看看