日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

發布時間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。