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