對Objective C 簡寫方式的理解

@literals(簡寫)

NSNumber

[NSNumber numberWithChar:‘X’]簡寫為 @‘X’;
[NSNumber numberWithInt:12345] 簡寫為 @12345
[NSNumber numberWithUnsignedLong:12345ul] 簡寫為 @12345ul
[NSNumber numberWithLongLong:12345ll] 簡寫為 @12345ll
[NSNumber numberWithFloat:123.45f] 簡寫為 @123.45f
[NSNumber numberWithDouble:123.45] 簡寫為 @123.45 
[NSNumber numberWithBool:YES] 簡寫為 @YES 

NSDictionary

[NSDictionary dictionary] 簡寫為 @{}
[NSDictionary dictionaryWithObject:o1forKey:k1] 簡寫為 @{ k1 : o1 }
[NSDictionarydictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 
簡寫為 @{ k1 : o1, k2 : o2, k3 : o3 }  

當寫下@{ k1 : o1, k2 : o2, k3 : o3 }時,實際的代碼會是

// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count];

NSArray

[NSArray array] 簡寫為 @[]
[NSArray arrayWithObject:a] 簡寫為 @[ a ]
[NSArray arrayWithObjects:a, b, c, nil] 簡寫為 @[ a, b, c ]  

比如對于@[ a, b, c ],實際編譯時的代碼是

// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects)/ sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

Mutable版本和靜態版本上面所生成的版本都是不可變的,想得到可變版本的話,可以對其發送-mutableCopy消息以生成一份可變的拷貝。

例如一下代碼:盡管使用NSMutableAarray 來存儲初始化的數組,但是planets并不是可變數組,即planet不是mutable版本,如果對palnet進行修改,會異常:

 NSMutableArray* planets = @[
      @"Mercury",
      @"Venus",
      @"Earth",
      @"Mars",
      @"Jupiter",
      @"Saturn",
      @"Uranus",
      @"Neptune"
    ];

我們可以通過對簡寫初始化的NSArray不可變版本進行一個mutable的拷貝,就可以獲得一份可變拷貝,如下代碼所示:

  NSMutableArray* mutablePlanets = [@[
      @"Mercury",
      @"Venus",
      @"Earth",
      @"Mars",
      @"Jupiter",
      @"Saturn",
      @"Uranus",
      @"Neptune"
    ] mutableCopy];

另外,對于標記為static的數組,不能使用簡寫為其賦值(其實原來的傳統寫法也不行)。

如果直接賦值就會提示出錯

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容