Objective-C literal 宣告物件内容

Objective-C literal 宣告物件内容

在之前物件宣告必需要先配置记忆体空间再进行初始化动作:

    NSString *string = [[NSString alloc] initWidthString:@"i am String"]];

Objective-C 1.0时已经增加字面宣告(literal)的方式,它代表的就是不需要覆杂的方式进行物件的宣告,不过当时只有支援NSString:

    NSString *literalString = @“i am String literal”;

现在增加支援NSNumberNSArrayNSDictinoary。这些宣告方式整体看来也更容易阅读也减少了原始码大小,接下来我们就来看一下这几种是如何去建立:

NSNumber

原来:

    NSNumber *demoNumber = [NSNumber numberWithInt:1234];

字面宣告(literal):

    NSNumber *demoNumber = @1234;

NSNumber各种型别也是可以:

    NSNumber *intNumber = @1234;                  //[NSNumber numberWithInt:1234]
    NSNumber *floatNumber = @1234.02f;            //[NSNumber numberWithFloat:1234.02f]
    NSNumber *mathematicsNumber = @1.23402e23;    //[NSNumber numberWithFloat:1.23402e23]
    NSNumber *boolNumber = @“YES”;                //[NSNumber numberWithBool:YES]
    NSNumber *charNumber = @"Y";                  //[NSNumber numberWithChar:'Y']

强制转换

字面宣告(literal)是一个概念,但还是需要编译器的配合,下面是字面宣告(literal)针对变数的操作方式:

float version =1.0f
NSNumber *versionNumber = @(version); //[NSNumber numberWithFloat:version]

利用字面宣告(literal)@(内容)的原理,将C宣告内容使用字面宣告(literal)的方式强制转换成Number物件,但要清楚被转换的变数要能转成数值的才行。

NSArray

NSArray也是支援,当然活用性就更高了,依照之前例子加上NSArray未使用字面宣告(literal)方式:

    NSArray *mathematicsNumberArray = [NSArray arrayWithObjects:@1234,@1234.02f,@1.23402e23,nil];

其实支援literal后,还能更简洁,宣告时要使用@[...]格式规则,其中每个元素用,格开:

    NSArray *mathematicsNumberArray = @[@1234,@1234.02f,@1.23402e23];

NSString使用字面宣告(literal)加入NSArray:

    NSArray *stringArray = @[@“123”,@“ABC”,@“OO”];

混用:

    NSArray *array = @[ @"ABC", @123 ];

上述所提供的都是设定初始值,不过在NSArray还可以支援取值的方式,承上个例子, 如果要取得第一个NSArray值会是: 原来方式:

    NSArray *stringIndex1= [stringArray objectAtIndex:1];

literal:

    NSString *string1= stringArray[1];

NSDictionary

NSDictionary 原本宣告方式相常的覆杂,且要先输入值(Value)再输入键值(Key):

    NSDictionary *keyvalueDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@“value1”, @“key1”,@“value2”, @"key2”,@“value3”, @"key3”,nil];

NSDictionary使用字面宣告(literal)必需被@{....}框住,填入顺序先key再vale为一组,key与value中间使用:隔开,每组每组间用,隔开:

    NSDictionary *keyvalueDictionary = @{@“key1”:@“keyvalue1”,@“key2”:@“keyvalue2”:@“key2”,@“keyvalue3”};

但上面例子所宣告的NSDictionary结构属于不可变(immutable),无法动态的增加新的键值组,如果你是要宣告成mutable方式要在后面加上mutablecopy

    NSMutableDictionary *keyvalueDictionary = [@{@“keyvalue1”,key1,@“keyvalue2”,key2,@“keyvalue3”,key3} mutablecopy];

前面所提到的都是使用literal宣告方式的方法,但这些方法在NSDictionary与NSArray的宣告时就会发挥较好的作用,下面再来看覆杂一点的NSDictionary:

    NSDictionary keyvalueDictionary1 = @{@“key1”,@“keyvalue1”,@“key2”,@[@-1234.12, @12345],@“key2”,@“keyvalue3”};

在NSDictionary中的值宣告NSArray的NSNumber物件,使用上比以往来的简便一些。

参考资料

Objective-C Literals

New Objective-C Literal Syntax for NSArray, NSDictionary

更新日志

日期 内容
2017/06/06 更新内容及范例
2014/01/10 初版

关键字

  • 使用Objective-C literal来宣告初始值
  • Objective-C literals