Objective-C中的語法糖示例詳解
語法糖
語法糖(Syntactic sugar),也譯為糖衣語法,是由英國計算機科學家彼得·約翰·蘭達(Peter J. Landin)發(fā)明的一個術(shù)語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。
——維基百科
需要聲明的是“語法糖”這個詞絕非貶義詞,它可以給我?guī)矸奖?,是一種便捷的寫法,編譯器會幫我們做轉(zhuǎn)換;而且可以提高開發(fā)編碼的效率。
通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會,本文在簡單的介紹 OC 語法糖的同時也會跟大家分享下我們使用過程中發(fā)現(xiàn)的'新'問題。下面話不多說了,來一起看看詳細的介紹吧。
語法糖的自白
先舉個生活中的🌰:
- 老班:為了傳達教育局和學校的教育精神我來講幾句。
- 老班:下面我要講啦啊。
- 老班:我要講的是教育局和學校剛傳達的規(guī)定。
- 老班:最近校長發(fā)現(xiàn)遲到學生越來越多。
- 老班:為了維護教學秩序,學校制定了新校規(guī)。
- 老班:.....
- 小明:說人話!
- 老班:從明天起7點鐘準時到校上課!
老班巴拉巴拉講了一堆,其實只是要表達*從明天起 7 點鐘準時到校上課!*雖然最終能表達出效果,但是老班說的累小明們聽著也煩。舉這個例子可能比較極端,至少我沒有遇到這么啰嗦的老師。但在編程語言中的確有不少讓程序員感到羅嗦的語法,讓人不能忍,這個時候語法糖 就派上了用場。
比如OC取數(shù)組元素:
id element = [array1 objectAtIndex:0];
OC 語法糖:你看,我是不是寫起來很方便?
id element = array1[0];
OC 語法糖:往下看,我還能做更多呢。
OC語法糖
@[] 和 @{}
NSArray
一般數(shù)組的初始化和訪問數(shù)組元素是這樣的:
// NSArray 的 alloc 初始化 NSArray *array1 = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil]; // NSArray 的便捷構(gòu)造 NSArray *array2 = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
獲取數(shù)組中的元素可以這樣的:
// 獲取相應索引的元素 id element = [array1 objectAtIndex:0]; NSLog(@"array1_count = %d, array[0] = %@",[array1 count], element);
如果使用語法糖,可以這樣寫:
// NSArray的定義
NSArray *array = @[@"lu", @"da", @"shi", @YES, @123];
int count = (int)[array count];
for (int i = 0; i < count; i++)
{
NSLog(@"%@", array[i]);
}
NSDictionary
字典的初始化一般是這樣的:
NSDictionary *dictionay = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]; id value = [dictionay objectForKey:@"key1"]; NSLog(@"key1 => %@", value);
我們還可以這樣簡化:
NSDictionary *dictionary = @{
@"key0" : @"value0",
@"key1" : @"value1",
@"key2" : @"value2"
};
NSLog(@"key2 => %@", dictionary[@"key2"]);
事實上 [ ] 和 { } 在JSON數(shù)據(jù)格式中最常見了,[ ] 一般封裝一個數(shù)組,{ } 一般封裝一個整體對象。
NSNumber
一般寫法是這樣的:
NSNumber *intNumber = [NSNumber numberWithInt:123];
NSNumber *floatNumber = [NSNumber numberWithFloat:12.3];
NSNumber *charNumber = [NSNumber numberWithChar:@('a')];
語法糖簡化寫法:
NSNumber *a = @123;
NSNumber *b = @12.3;
NSNumber *c = @('a');
NSLog(@"a = %@, b = %@, c = %@", a, b, c);
. 點語法
再用數(shù)組 NSArray *array = @[@"lu", @"da", @"shi", @YES, @123]; 舉例。想要獲取數(shù)組中有多少個元素,我們平時都是怎么做的?
[array count] 還是 array.count?
老司機們思索片刻后說到:好像都用過,但是...我們知道在 OC 中 [] 和 . 分別代表調(diào)用方法和屬性,看申明明明是屬性呀,怎么可以用 . 方法?
從 OC 2.0 開始只要符合系統(tǒng)默認 setter、getter 書寫格式的方法都可以使用. 點語法,屬性是一對 getter、setter 方法,點語法是屬性的另一種調(diào)用格式,就是語法糖方法。這么做的目的只有一個,就是增加可讀性、兼容常見用法減少代碼報錯!
OC語法糖帶來的'坑'
一般我們認為語法糖帶來了方便,特別是對于字典的初始化 直接是key:value的賦值方式比 dictionaryWithObjectsAndKeys 這種反人類的方式友好的多。
但真的沒有其他什么問題嗎?看下下面兩個定義及運行結(jié)果:


可見 dictionaryWithObjectsAndKeys 如果遇到 value 為 nil 的情況,后續(xù) key-value 不會入庫直接當做末尾 nil 結(jié)束初始化;
而語法糖的方式就直接崩潰了,對崩潰了。
所以使用語法糖還需要注意數(shù)據(jù)合法性問題,nil 會造成意外的崩潰哦!
基本原理
語法糖就是語言中的一個構(gòu)件,當去掉該構(gòu)件后并不影響語言的功能和表達能力。而使用語法糖語言的處理器,包括編譯器,靜態(tài)分析器等,會在處理之前把語法糖構(gòu)件轉(zhuǎn)換成加糖之前的構(gòu)件,這個過程通常被稱為:desugaring。說白了,語法糖就是對現(xiàn)有語法的一個封裝,編譯運行的時候再脫掉這層糖衣變?yōu)槔系恼Z法實現(xiàn)。
寫在最后
之所以叫「語法」糖,不只是因為加糖后的代碼功能與加糖前保持一致,更重要的是糖在不改變其所在位置的語法結(jié)構(gòu)的前提下,實現(xiàn)了運行時等價??梢院唵卫斫鉃椋犹呛蟮拇a編譯后跟加糖前一摸一樣。
之所以叫語法「糖」,是因為加糖后的代碼寫起來很爽,包括但不限于:代碼更簡潔流暢,代碼更語義自然,寫得爽,看著爽!
「糖」也可能有毒,使用需謹慎。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS保存App中的照片到系統(tǒng)相冊或自建相冊的方法
這篇文章主要介紹了iOS保存App中的照片到系統(tǒng)相冊或自建相冊的方法,示例代碼為傳統(tǒng)的Objective-C語言寫成,需要的朋友可以參考下2016-04-04
ios開發(fā)Flutter之數(shù)據(jù)存儲
這篇文章主要為大家介紹了ios開發(fā)Flutter之數(shù)據(jù)存儲的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
IOS 開發(fā)之數(shù)據(jù)存儲writeToFile的應用實例
這篇文章主要介紹了IOS 開發(fā)之數(shù)據(jù)存儲writeToFile的應用實例的相關(guān)資料,這里提供實例幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
iOS 使用 socket 實現(xiàn)即時通信示例(非第三方庫)
這篇文章主要介紹了iOS 使用 socket 即時通信示例(非第三方庫)的資料,這里整理了詳細的代碼,有需要的小伙伴可以參考下。2017-02-02
iOS開發(fā)中Swift3 監(jiān)聽UITextView文字改變的方法(三種方法)
在項目中使用文本輸入框出UITextField之外還會經(jīng)常使用 UITextView ,難免會有需求監(jiān)聽UITextView文本框內(nèi)文本數(shù)量.下面介紹在swift3中兩種常用方式,需要的朋友參考下吧2016-11-11

