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