前言:自己总结的一些关于OC中点面量语法的东东!有不对的地方希望大神们能指出来改正。
点面量语法是自Objective-C 1.0推出的能够以很简单方式创建数据对象的语法。
例如:下面快速简便创建的NSString对象,就是“字符串字面量(string literal)” 。
NSString *string = @"Objective-C";
等同
NSString *string = [[NSString alloc] initWithString:@"Objective-C"];
下面我会介绍点面量语法在Objective-C中常见的几种用法。
1. 字面数值
// 字符型
+ (NSNumber *)numberWithChar:(char)value;
NSNumber *charNumber = @'a';
// 整型
+ (NSNumber *)numberWithInt:(int)value;
NSNumber *intNumber = @100;
// 浮点型
+ (NSNumber *)numberWithFloat:(float)value;
NSNumber *floatNumber = @3.14f;
// 双浮点型
+ (NSNumber *)numberWithDouble:(double)value;
NSNumber *doubleNumber = @3.14159;
// BOOL类型
+ (NSNumber *)numberWithBool:(BOOL)value;
NSNumber *boolNumber = @YES;
字面量语法同样适用于表达式:
int num1 = 5;
float num2 = 4.66f;
NSNumber *sumNumber = @(num1 * num2);
---------------------------------------------------
运行结果
2015-09-12 13:18:34.778 NSNumber[2041:365020] 23.3
字面量表示数值,非常有用,既能简化代码,更能令NSNuber对象整洁,易读。
2.字面量数组
2.1 数组创建:
常用创建数组的方式是这样:
NSArray *array1 = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", nil];
或者这样
NSArray *array2 = [[NSArray arrayWithObjects:@"1", @"2", @"3", nil];
// 而字面量语法创建数组是这样:
NSArray *array3 = @[@"1", @"2", @"3"];
2.2 数组元素的读取
点面量语法不仅在创建是可以使用,当需要取出某个下标对应的对象时:
// 常见的读取方法是:
NSString *three = [array3 objectAtIndex:2];
// 等效的字面量语法:
NSString *three = array3[2];
注意:
使用字面量语法创建数组时,若数据元素对象中有nil,会报异常。因为字面量语法实际上是一种 “语法糖” 。
NSArray *array1 = [NSArray arrayWithObjects:@"object1", nil, @"object3", nil];
NSArray *array2 = @[@"object1", nil, @"object3"];
上面创建的两个数组,array1中,第二个对象为nil,即空,不会抛出异常,但存入数据时只能存储"object1",方法遇到nil时会自动停止,方法提前结束。而字面量创建的array2会立即抛出异常。从例子中可以感觉到,字面量语法更加安全。能更快的发现错误。
3.字面量词典
3.1 字典的创建
// 常见的字典创建方式:数据输入为 <对象><键><对象><键>
NSDictionary *humanData = [NSDictionary dictionaryWithObjectsAndKeys:@"张三", @"name", [NSNumber numberWithInt:25], @"age", nil];
// 字面量语法创建字典: <键><对象> 的方式
NSDictionary *humanData = @{@"name" : @"张三", @"age" : @23};
3.2 字典读取
// 常规的通过键值访问对应对象
NSString *name = [humanData objectForKey:@"name"];
// 等效的字面量语法:
NSString *name = humanData[@"name"];
3.3 可变字典值修改
// 常规的通过键值修改对象
[mutableData setObject:@"李四" forKey:@"name"];
// 等效的字面量语法
mutableData[@"name"] = @"李四";