Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
Atitit.swift?的新特性?以及與java的對比?改進方向attilax?總結(jié)
?
?
1.?defer關(guān)鍵字1
2.?try!形式存在的“不失敗”機制3
3.?Guard 4
4.?swift的新語法,可以很好地支持內(nèi)部DSL 6
5.?Tuple?的好處??Tuple?就是不能update的list?。Tuple?比?list?操作速度快.6
6.?私有屬性?很多語言都沒有,都靠使用者自覺 7
7.?ref7
?
1.?defer關(guān)鍵字
在一些語言中,有try/finally這樣的控制語句,比如Java。這種語句可以讓我們在finally代碼塊中執(zhí)行必須要執(zhí)行的代碼,不管之前怎樣的興風(fēng)作浪。在Swift?2.0中,Apple提供了defer關(guān)鍵字,讓我們可以實現(xiàn)同樣的效果。
這是目前為止我最愛的?Swift?新特性(又見最愛……)。defer語句與很多其他語言中的finally語句很像,不過它不需要與try語句綁定在一起,你可以把它放在任何你想放的位置。如果你寫了defer{…},那么那個代碼塊中的代碼就會在控制離開當(dāng)前函數(shù)的范圍時執(zhí)行,無論函數(shù)最后是運行到了結(jié)尾,還是遇到了return語句,或者是拋出了錯誤。
?
作者::?綽號:老哇的爪子?(?全名::Attilax?Akbar?Al?Rapanui?阿提拉克斯?阿克巴?阿爾?拉帕努伊?)?漢字名:艾龍,??EMAIL:1466519819@qq.com
轉(zhuǎn)載請注明來源:?http://blog.csdn.net/attilax
?
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | func?checkSomething()?{ ????? ????print("CheckPoint?1") ????doSomething() ????print("CheckPoint?4") ????? } func?doSomething()?{ ????? ????print("CheckPoint?2") ????defer?{ ????????print("Clean?up?here") ????} ????print("CheckPoint?3") ????? } checkSomething()?//?CheckPoint?1,?CheckPoint?2,?CheckPoint?3,?Clean?up?here,?CheckPoint?4 |
?
上述示例可以看到,在打印出“CheckPoint?2”之后并沒有打印出“Clean?up?here”,而是“CheckPoint?3”,這就是defer的作用,它對進行了print("Clean?up?here")延遲。我們再來看一個I/O的示例:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //?偽代碼 func?writeSomething()?{ ????? ????let?file?=?OpenFile() ????? ????let?ioStatus?=?fetchIOStatus() ????guard?ioStatus?!=?"error"?else?{ ????????return ????} ????file.write() ????? ????closeFile(file) ????? } |
?
上述示例是一個I/O操作的偽代碼,如果獲取到的ioStatus正常,那么該方法沒有問題,如果ioStatus取到的是error,那么會被guard語句抓到執(zhí)行return操作,這樣的話closeFile(file)就永遠都不會執(zhí)行了,一個嚴(yán)重的Bug就這樣產(chǎn)生了。下面我們看看如何用defer來解決這個問題:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //?偽代碼 func?writeSomething()?{ ????? ????let?file?=?OpenFile() ????defer?{ ????????closeFile(file) ????} ????? ????let?ioStatus?=?fetchIOStatus() ????guard?ioStatus?!=?"error"?else?{ ????????return ????} ????file.write() ????? } |
?
我們將closeFile(file)放在defer代碼塊里,這樣即使ioStatus為error,在執(zhí)行return前會先執(zhí)行defer里的代碼,這樣就保證了不管發(fā)生什么,最后都會將文件關(guān)閉。
defer又一個保證我們代碼健壯性的特性,我非常喜歡。
?
2.?try!形式存在的“不失敗”機制
另外一個與?Java?不同的地方是,Swift?有一個內(nèi)嵌的以try!形式存在的“不失敗”機制。有時一個方法只會在某種情況下調(diào)用失敗,并且你知道你所使用的那種情況下它是不會失敗的。上述getBytes調(diào)用就是?Java?中的一個很好的例子:它拋出UnsupportedEncodingException但是它能保證傳入“UTF-8”時一定不會拋出異常。即使你知道這不會失敗但調(diào)用時需要用try來解包。在?Swift?中,你可以使用try!來完成這些,既清楚又簡短。這與“!”后綴語法配合得很好,!后綴用來解包你知道肯定不會為nil的可選類型,就像上面的dataUsingEncoding,類似的還有as!操作符來轉(zhuǎn)換類型并且你已知這個操作肯定會成功。
3.?Guard
這看起來好多了,但是煩人的是,條件現(xiàn)在被反轉(zhuǎn)為檢查錯誤情況而不是正確情況了。
優(yōu)點::減少語句,and?ide檢查
更糟的是如果你忘了return語句,編譯器就不管了,你的代碼會開開心心地在錯誤情況執(zhí)行完之后繼續(xù)執(zhí)行。guard解決了所有這些問題:
編譯器那里獲得了更多的幫助
let?fd2?=?open(...)if?fd2?==?-1?{
????//?handle?fd2?error
????close(fd1)
????return
}
//?use?fd1?and?fd2?here
close(fd1)
?
let?fd1?=?open(...)
guard?fd1?>=?0?else?{
????//?handle?fd1?error
????return
}
let?fd2?=?open(...)
guard?fd2?>=?0?else?{
????//?handle?fd2?error
????close(fd1)
????return
}
//?use?fd1?and?fd2?here
close(fd1)
close(fd2)
這就更好了!這看起來更清晰了,并且從編譯器那里獲得了更多的幫助。但是這并沒有什么特別的啊,那為什么這是我最喜歡的呢?那是因為,跟if語句一樣,guard語句也可以包含變量聲明并且檢查是否為nil。但guard語句又不像if語句那樣,聲明的變量不僅僅是在guard語句范圍內(nèi)可用。為了幫助大家理解,我們先來看上面例子的一個可選類型版本,首先是那個金字塔:
?
4.?swift的新語法,可以很好地支持內(nèi)部DSL
?有一種編程風(fēng)格,不太好歸類。就是將程序拆分成,描述+解釋。解釋部分寫一次,其它地方使用描述式的語句,而不是命令式的語句。
內(nèi)部DSL,通常利用主語言的語法特性,創(chuàng)出一套寫法,來寫一些描述性的語句。這些語句組合起來,就像一門新語言似得。這個比較難理解。舉個例子(從ruby那里借過來的),假如計算,幾小時之后的秒數(shù)。C語言中,大概會寫成
5.?Tuple?的好處??Tuple?就是不能update的list?。Tuple?比?list?操作速度快.
Tuple?比?list?操作速度快.如果您定義了一個值的常量集,并且唯一要用它做的是不斷地遍歷它,請使用?tuple?代替?list.
如果對不需要修改的數(shù)據(jù)進行?“寫保護”,可以使代碼更安全.使用?tuple?而不是?list?如同擁有一個隱含的?assert?語句,說明這一數(shù)據(jù)是常量.如果必須要改變這些值,則需要執(zhí)行?tuple?到?list?的轉(zhuǎn)換.
?
6.?私有屬性?很多語言都沒有,都靠使用者自覺
7.?ref
Swift?2.0初探:值得注意的新特性?-?CocoaChina_讓移動開發(fā)更簡單.htm
Swift?中最棒的新特性?-?簡書.htm
?
總結(jié)
以上是生活随笔為你收集整理的Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于位置搜索的文章
- 下一篇: SecureCRT登陆Centos 6.