欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Objective-C中的語(yǔ)法糖示例詳解

 更新時(shí)間:2018年01月05日 09:45:45   作者:周強(qiáng)  
開(kāi)發(fā)過(guò)程中我特別喜歡用語(yǔ)法糖,原因很簡(jiǎn)單,懶得看到一堆長(zhǎng)長(zhǎng)的代碼,但語(yǔ)法糖簡(jiǎn)單卻不那么簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于Objective-C中語(yǔ)法糖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

語(yǔ)法糖

語(yǔ)法糖(Syntactic sugar),也譯為糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。

——維基百科

需要聲明的是“語(yǔ)法糖”這個(gè)詞絕非貶義詞,它可以給我?guī)?lái)方便,是一種便捷的寫法,編譯器會(huì)幫我們做轉(zhuǎn)換;而且可以提高開(kāi)發(fā)編碼的效率。

通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯(cuò)的機(jī)會(huì),本文在簡(jiǎn)單的介紹 OC 語(yǔ)法糖的同時(shí)也會(huì)跟大家分享下我們使用過(guò)程中發(fā)現(xiàn)的'新'問(wèn)題。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

語(yǔ)法糖的自白

先舉個(gè)生活中的🌰:

  • 老班:為了傳達(dá)教育局和學(xué)校的教育精神我來(lái)講幾句。
  • 老班:下面我要講啦啊。
  • 老班:我要講的是教育局和學(xué)校剛傳達(dá)的規(guī)定。
  • 老班:最近校長(zhǎng)發(fā)現(xiàn)遲到學(xué)生越來(lái)越多。
  • 老班:為了維護(hù)教學(xué)秩序,學(xué)校制定了新校規(guī)。
  • 老班:.....
  • 小明:說(shuō)人話!
  • 老班:從明天起7點(diǎn)鐘準(zhǔn)時(shí)到校上課!

老班巴拉巴拉講了一堆,其實(shí)只是要表達(dá)*從明天起 7 點(diǎn)鐘準(zhǔn)時(shí)到校上課!*雖然最終能表達(dá)出效果,但是老班說(shuō)的累小明們聽(tīng)著也煩。舉這個(gè)例子可能比較極端,至少我沒(méi)有遇到這么啰嗦的老師。但在編程語(yǔ)言中的確有不少讓程序員感到羅嗦的語(yǔ)法,讓人不能忍,這個(gè)時(shí)候語(yǔ)法糖 就派上了用場(chǎng)。

比如OC取數(shù)組元素:

id element = [array1 objectAtIndex:0];

OC 語(yǔ)法糖:你看,我是不是寫起來(lái)很方便?

id element = array1[0];

OC 語(yǔ)法糖:往下看,我還能做更多呢。

OC語(yǔ)法糖

@[] 和 @{}

NSArray

一般數(shù)組的初始化和訪問(wèn)數(shù)組元素是這樣的:

// NSArray 的 alloc 初始化
NSArray *array1 = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", nil];
// NSArray 的便捷構(gòu)造
NSArray *array2 = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

獲取數(shù)組中的元素可以這樣的:

// 獲取相應(yīng)索引的元素
id element = [array1 objectAtIndex:0];
NSLog(@"array1_count = %d, array[0] = %@",[array1 count], element);

如果使用語(yǔ)法糖,可以這樣寫:

// 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);

我們還可以這樣簡(jiǎn)化:

NSDictionary *dictionary = @{
    @"key0" : @"value0",
    @"key1" : @"value1",
    @"key2" : @"value2"
    };
NSLog(@"key2 => %@", dictionary[@"key2"]);

事實(shí)上 [ ] 和 { } 在JSON數(shù)據(jù)格式中最常見(jiàn)了,[ ] 一般封裝一個(gè)數(shù)組,{ } 一般封裝一個(gè)整體對(duì)象。

NSNumber

一般寫法是這樣的:

NSNumber *intNumber = [NSNumber numberWithInt:123];
NSNumber *floatNumber = [NSNumber numberWithFloat:12.3];
NSNumber *charNumber = [NSNumber numberWithChar:@('a')];

語(yǔ)法糖簡(jiǎn)化寫法:

NSNumber *a = @123;
NSNumber *b = @12.3;
NSNumber *c = @('a');
NSLog(@"a = %@, b = %@, c = %@", a, b, c);

. 點(diǎn)語(yǔ)法

再用數(shù)組 NSArray *array = @[@"lu", @"da", @"shi", @YES, @123]; 舉例。想要獲取數(shù)組中有多少個(gè)元素,我們平時(shí)都是怎么做的?

[array count] 還是 array.count?

老司機(jī)們思索片刻后說(shuō)到:好像都用過(guò),但是...我們知道在 OC 中 [] 和 . 分別代表調(diào)用方法和屬性,看申明明明是屬性呀,怎么可以用 . 方法?

從 OC 2.0 開(kāi)始只要符合系統(tǒng)默認(rèn) setter、getter 書寫格式的方法都可以使用. 點(diǎn)語(yǔ)法,屬性是一對(duì) getter、setter 方法,點(diǎn)語(yǔ)法是屬性的另一種調(diào)用格式,就是語(yǔ)法糖方法。這么做的目的只有一個(gè),就是增加可讀性、兼容常見(jiàn)用法減少代碼報(bào)錯(cuò)!

OC語(yǔ)法糖帶來(lái)的'坑'

一般我們認(rèn)為語(yǔ)法糖帶來(lái)了方便,特別是對(duì)于字典的初始化 直接是key:value的賦值方式比 dictionaryWithObjectsAndKeys 這種反人類的方式友好的多。

但真的沒(méi)有其他什么問(wèn)題嗎?看下下面兩個(gè)定義及運(yùn)行結(jié)果:


可見(jiàn) dictionaryWithObjectsAndKeys 如果遇到 value 為 nil 的情況,后續(xù) key-value 不會(huì)入庫(kù)直接當(dāng)做末尾 nil 結(jié)束初始化;

而語(yǔ)法糖的方式就直接崩潰了,對(duì)崩潰了。

所以使用語(yǔ)法糖還需要注意數(shù)據(jù)合法性問(wèn)題,nil 會(huì)造成意外的崩潰哦!

基本原理

語(yǔ)法糖就是語(yǔ)言中的一個(gè)構(gòu)件,當(dāng)去掉該構(gòu)件后并不影響語(yǔ)言的功能和表達(dá)能力。而使用語(yǔ)法糖語(yǔ)言的處理器,包括編譯器,靜態(tài)分析器等,會(huì)在處理之前把語(yǔ)法糖構(gòu)件轉(zhuǎn)換成加糖之前的構(gòu)件,這個(gè)過(guò)程通常被稱為:desugaring。說(shuō)白了,語(yǔ)法糖就是對(duì)現(xiàn)有語(yǔ)法的一個(gè)封裝,編譯運(yùn)行的時(shí)候再脫掉這層糖衣變?yōu)槔系恼Z(yǔ)法實(shí)現(xiàn)。

寫在最后

之所以叫「語(yǔ)法」糖,不只是因?yàn)榧犹呛蟮拇a功能與加糖前保持一致,更重要的是糖在不改變其所在位置的語(yǔ)法結(jié)構(gòu)的前提下,實(shí)現(xiàn)了運(yùn)行時(shí)等價(jià)??梢院?jiǎn)單理解為,加糖后的代碼編譯后跟加糖前一摸一樣。

之所以叫語(yǔ)法「糖」,是因?yàn)榧犹呛蟮拇a寫起來(lái)很爽,包括但不限于:代碼更簡(jiǎn)潔流暢,代碼更語(yǔ)義自然,寫得爽,看著爽!

「糖」也可能有毒,使用需謹(jǐn)慎。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • iOS實(shí)現(xiàn)動(dòng)態(tài)的開(kāi)屏廣告示例代碼

    iOS實(shí)現(xiàn)動(dòng)態(tài)的開(kāi)屏廣告示例代碼

    啟動(dòng)圖是在iOS開(kāi)發(fā)過(guò)程中必不可少的一個(gè)部分,很多app在啟動(dòng)圖之后會(huì)有一張自定義的開(kāi)屏廣告圖,但是有的時(shí)候需要讓啟動(dòng)圖看起來(lái)就是一個(gè)廣告,而且還要這個(gè)廣告里面會(huì)動(dòng),iOS的啟動(dòng)圖只能是靜態(tài)的,而且固定,為了實(shí)現(xiàn)看起來(lái)的動(dòng)畫效果,只能進(jìn)行偽造了。下面來(lái)一起看看
    2016-09-09
  • iOS本地推送簡(jiǎn)單實(shí)現(xiàn)代碼

    iOS本地推送簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了iOS本地推送簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS實(shí)現(xiàn)百度地圖定位簽到功能

    iOS實(shí)現(xiàn)百度地圖定位簽到功能

    這篇文章主要給大家介紹了iOS實(shí)現(xiàn)百度地圖定位簽到功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • IOS代碼筆記之左右滑動(dòng)效果

    IOS代碼筆記之左右滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了IOS代碼筆記之左右滑動(dòng)效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • iOS保存App中的照片到系統(tǒng)相冊(cè)或自建相冊(cè)的方法

    iOS保存App中的照片到系統(tǒng)相冊(cè)或自建相冊(cè)的方法

    這篇文章主要介紹了iOS保存App中的照片到系統(tǒng)相冊(cè)或自建相冊(cè)的方法,示例代碼為傳統(tǒng)的Objective-C語(yǔ)言寫成,需要的朋友可以參考下
    2016-04-04
  • ios開(kāi)發(fā)Flutter之?dāng)?shù)據(jù)存儲(chǔ)

    ios開(kāi)發(fā)Flutter之?dāng)?shù)據(jù)存儲(chǔ)

    這篇文章主要為大家介紹了ios開(kāi)發(fā)Flutter之?dāng)?shù)據(jù)存儲(chǔ)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • IOS 開(kāi)發(fā)之?dāng)?shù)據(jù)存儲(chǔ)writeToFile的應(yīng)用實(shí)例

    IOS 開(kāi)發(fā)之?dāng)?shù)據(jù)存儲(chǔ)writeToFile的應(yīng)用實(shí)例

    這篇文章主要介紹了IOS 開(kāi)發(fā)之?dāng)?shù)據(jù)存儲(chǔ)writeToFile的應(yīng)用實(shí)例的相關(guān)資料,這里提供實(shí)例幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-09-09
  • iOS自定義鍵盤切換效果

    iOS自定義鍵盤切換效果

    這篇文章主要為大家詳細(xì)介紹了iOS自定義鍵盤切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • iOS 使用 socket 實(shí)現(xiàn)即時(shí)通信示例(非第三方庫(kù))

    iOS 使用 socket 實(shí)現(xiàn)即時(shí)通信示例(非第三方庫(kù))

    這篇文章主要介紹了iOS 使用 socket 即時(shí)通信示例(非第三方庫(kù))的資料,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2017-02-02
  • iOS開(kāi)發(fā)中Swift3 監(jiān)聽(tīng)UITextView文字改變的方法(三種方法)

    iOS開(kāi)發(fā)中Swift3 監(jiān)聽(tīng)UITextView文字改變的方法(三種方法)

    在項(xiàng)目中使用文本輸入框出UITextField之外還會(huì)經(jīng)常使用 UITextView ,難免會(huì)有需求監(jiān)聽(tīng)UITextView文本框內(nèi)文本數(shù)量.下面介紹在swift3中兩種常用方式,需要的朋友參考下吧
    2016-11-11

最新評(píng)論