亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

程序遷移到swift 3.0的一些實用技巧

2020-03-09 17:46:14
字體:
來源:轉載
供稿:網友

前言

在去年swift3.0發布了,新版本可以在Xcode 8中使用了,或者你可以直接從swift.org下載編譯器。

從代碼可讀性來看,新版本有很多提升,函數調用的連續性,更好的命名約定和移除了部分c風格的元素。

從代碼可讀性來來看,NS前綴已經從Foundation類型中移除,例如NSBundle.mainBundle()現在改為Bundle.mainBundle() .

c風格的一元操作符++和--在3.0中已經不適用了:

// Only in Swift 2.2 and earliervar number = 10 number++ ++numbernumber-- --number

相對應的表達方式是number += 1 or number -= 1.

另外一個有趣的變化是移除了c風格的for-loop,我記得在學校中(使用c語言)寫這種循環:

// Only in Swift 2.2 and earlierlet steps = 5 for var step = 0; step < steps; step++ {  print(step)}// 0 1 2 3 4

主要的原因是存在了更好的對應寫循環的方法for-instride().for-loop在理解上比較困難和缺少swift風格。當新的方法出現后,for-loop已經很少在代碼庫中使用了。

這篇文章將講解典型的for-loop使用場景,同時說明遷移到 for-in, stride()或者簡單的while() {} .

一、如何遷移 for-loop 到 for-in

for-loop 應用的典型場景在一個數字區間內迭代。這些數字可以是數組的索引等.

例如,讓我們遍歷數組的每一個元素:

// Only in Swift 2.3 and earlierlet birds = ["pigeon", "sparrow", "titmouse"] for var index = 0; index < birds.count; index++ {  print(birds[index])}// "pigeon" "sparrow" "titmouse"

可見,let index = 0; index < birds.count; index++ 的循環部分是冗長的。許多元素是多余的,整個表達式可以簡化的。替換為手動的增量,整個操作可以用更具表達性的語法來自動化。

swift3,遷移,swift3.0遷移,swift2.3遷移swift3.0

for-in 循環更簡短和更具表達性。讓我們遷移上面的代碼:

let birds = ['pigeon', 'sparrow', 'titmouse'] for index in 0..<birds.count {  print(birds[index])}// 'pigeon', 'sparrow', 'titmouse'

現在感覺好很多了。index in 0..<birds.count 更容易閱讀和理解。0..<birds.count 這部分定義一個半開區間的 Range 類型。for-in 循環迭代0,1和2的范圍值(不包括上限3)。

這不是全部! 你甚至可以跳過索引并直接訪問數組元素:

let birds = ["pigeon", "sparrow", "titmouse"] for bird in birds {  print(bird)}// "pigeon" "sparrow" "titmouse"

可以看出,對于標準數組或集合迭代for-in對于for-loop是一個更好的替代。 至少在這種情況下,在Swift 3.0中刪除for-loop的決定是合理的。

二、如何遷移 for-loop 到 stride

你可以合理地要求for-loop雖然是冗長的,但仍然是靈活的。 它對于更復雜的迭代是有用的。

讓我們嘗試一個場景。你要打印一個具有奇數索引元素的元素數組。一個 for-loop 可能看起來像這樣:

// Only in Swift 2.3 and earlierlet colors = ["blue", "green", "red", "white", "black"] for var index = 0; index < colors.count; index += 2 {  print(colors[index])}// => "blue" "red" "black"

由于索引根據表達式 index += 2而每次增加2,所以只有奇數索引的元素會被顯示:”blue”, “red” and “black”.

你可以嘗試使用 for-in 并定義一個范圍。但是需要奇數索引加上附加的驗證:

let colors = ["blue", "green", "red", "white", "black"] for index in 0..<colors.count {  if (index % 2 == 0) { print(colors[index]) }}// => "blue" "red" "black"

的確, if (index % 2 == 0) { ... } 條件句在這里看起來怎么樣。

這種情況很符合使用 Swift 的stride(from: value, to: value, by: value)函數。定義開始,結束(不包括上限)和步長值,函數返回相應的數字序列。

讓我們在我們的場景中應用stride:

let colors = ["blue", "green", "red", "white", "black"] for index in stride(from: 0, to: colors.count, by: 2) {  print(colors[index])}// => "blue" "red" "black"

stride(from: 0, to: colors.count, by: 2) 返回以0開始到5的數字(上限不包含5),步長為2。對于 for-loop,這是一個好的替代。

如果上限必須包含進來,這里有另外一種函數格式:

stride(from: value, through: value, by: value) 。第二個參數的標簽是 through, 這個標簽是用以指明是包含上限的。

三、其他情況堅持使用while

c風格for-loop的每個組件都有一個很好的屬性:初始化,跳出嚴重和完全可配置的增量:

for <initialization>; <verification>; <increment> {  // loop body}

此外,你可以省略其中的任何組件,要是你能在for-loop的循環塊打破循環。

例如,讓我們打印一個數字數組的元素,直到數字0被遇到??梢允褂肅風格的for-loop:

// Only in Swift 2.2 and earlierlet numbers = [1, 6, 2, 0, 7], nCount = numbers.count for var index = 0; index < nCount && numbers[index] != 0; index++ {  print(numbers[index])}// => 1 6 2

驗證部分 index < nCount && numbers[index] != 0 是用以檢查是否0在數組中出現。如果出現,則跳出循環。

所以只有0之前的數字被打印出來:1,6和2。

for var index in 0..<nCount 是一個遷移選項。你只是需要使用條件 if numbers[index] == 0 ,當0出現的時候跳出循環:

let numbers = [1, 6, 2, 0, 7], nCount = numbers.count for index in 0..<nCount {  if (numbers[index] == 0) { break } print(numbers[index])}// => 1 6 2

但 break 語句出現,它會輕微減少閱讀流程。但是我想要容易地閱讀代碼流程!

while(<condition>) {...} 循環可能是一個更好的替代方案。讓我們看看上一個例子是如果被修改的:

let numbers = [1, 6, 2, 0, 7], nCount = numbers.count var index = 0 while (index < nCount && numbers[index] != 0) {  print(numbers[index]) index += 1}// => 1 6 2

如果你有的情況無法使用 for-in 或者 stride() , 那么我推薦你使用 while(){} 。

四、統一參數標簽行為

在Swift 2.2 和更早版本你可以在調用函數的時候忽略第一個參數的標簽:

// Only in Swift 2.2 and earlierfunc sum(firstItem: Int, secondItem: Int) -> Int {  return firstItem + secondItem}sum(5, secondItem: 2) // => 7

對于我來說,這個忽略的做法給我帶來困擾。你不得不忽略第一個參數的標簽,然而剩下的參數卻還保持有標簽。這是一種不自然的規則。

swift3,遷移,swift3.0遷移,swift2.3遷移swift3.0

幸運的是從3.0版本開始,所有參數將強制擁有標簽。

讓我們來遷移上一個例子:

func sum(firstItem: Int, secondItem: Int) -> Int {  return firstItem + secondItem}sum(firstItem: 5, secondItem: 2) // => 7

myFun(firstParam: 1, secondParam: 2)看起來更好。你知道嚴格的參數含義。簡單,一致和清晰的方式。

如果你因為某些原因想在Swift 3.0中調用函數的時候忽略第一個標簽,使用_ 作為那個參數的參數標簽:

func sum(_ firstItem: Int, secondItem: Int) -> Int {  return firstItem + secondItem}sum(5, secondItem: 2) // => 7

然而從長遠來看我不推薦這種做法。他破壞了Swift代碼中函數/方法調用的一致性。

Swift 命名向導 有很多有用的命名方面的建議。

總結

Swift 3.0 做了一個很好的修改列表。其中大部分是重大的修改,所以你必須花些功夫來遷移Swift 2.3或者更舊的代碼。

Swift 的制造者花了很多功夫來使這門語言用起來盡可能的舒服。

有時候,這個過程產生重大更改。幸運的是相比提高代碼的可讀性和跨語言語法的一致性來說,這是一個相對小的代價。

C風格的元素如for-loop,一元增量和減量運算被刪除。對于這些結構Swift提供了更好的選擇。

例如C語言風格的for循環很容易由for-in所取代。你可以使用stride()函數來進行更多可配置的迭代。

我最喜歡的改進是Swift 3.0引入了函數參數標簽的一致性和清晰度。

簡單易記的規則:始終指明參數的標簽。

我建議你也訪問Swift 3.0官方的遷移向導。

英文原文鏈接:https://rainsoft.io/useful-tips-for-migrating-to-swift-3-0/

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者使用Swift能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品自拍第一页| 国产一区深夜福利| 国产精品成人在线| 国产精品第七十二页| 91超碰caoporn97人人| 国产精品中文字幕在线观看| 国产91露脸中文字幕在线| 成人国产在线视频| 日韩av在线网页| 欧美亚洲一区在线| www.亚洲男人天堂| 亚洲国产精久久久久久| 性欧美暴力猛交69hd| 91精品成人久久| 亚洲精品成人av| 久久欧美在线电影| 成人黄色在线免费| 色综合色综合久久综合频道88| 久久免费福利视频| 日韩在线观看成人| 国产精品第一第二| 国产午夜精品理论片a级探花| 亚洲图片欧洲图片av| 久久免费精品视频| 亚洲午夜久久久影院| 亚洲免费av片| 久久国产精品网站| 欧美另类99xxxxx| 久久久影视精品| 亚洲一区二区精品| 日韩精品在线观看一区| 亚洲影院高清在线| 久久精品国产综合| 成人福利视频在线观看| 青青久久av北条麻妃黑人| 日韩中文字幕视频在线观看| 久久亚洲影音av资源网| 一本色道久久综合亚洲精品小说| 亚洲午夜av久久乱码| 性欧美在线看片a免费观看| 欧美另类极品videosbest最新版本| 亚洲女人被黑人巨大进入al| 狠狠躁天天躁日日躁欧美| 精品国产老师黑色丝袜高跟鞋| 福利一区视频在线观看| 亚洲电影免费观看高清| 亚洲第一区第二区| 国产精品久久久久免费a∨大胸| 最近2019中文字幕第三页视频| 久久亚洲国产精品| 久久综合免费视频| 欧美精品在线第一页| 欧洲s码亚洲m码精品一区| 国产日韩欧美在线视频观看| 久久91亚洲人成电影网站| 国产精品视频免费在线| 97av在线影院| 成人黄色大片在线免费观看| 97在线视频免费播放| 高清欧美性猛交xxxx| 日韩欧美在线视频观看| 懂色aⅴ精品一区二区三区蜜月| 色偷偷91综合久久噜噜| 亚洲japanese制服美女| 久久精彩免费视频| 亚洲高清福利视频| 日本在线精品视频| 超在线视频97| 欧美成人精品三级在线观看| 国产精品www色诱视频| 亚洲电影免费观看高清完整版| 日韩电视剧在线观看免费网站| 亚洲色图偷窥自拍| 国产精品人成电影| 国产亚洲在线播放| 青青精品视频播放| 欧美日韩电影在线观看| 亚洲色图激情小说| 欧美性在线观看| 日韩不卡中文字幕| 亚洲电影免费观看高清完整版在线观看| 日韩美女中文字幕| 国产xxx69麻豆国语对白| 日韩成人在线播放| 国产精品午夜一区二区欲梦| 精品中文字幕在线2019| 国产日产久久高清欧美一区| 国产精品成人av在线| 中文字幕日韩精品在线观看| 国产综合在线看| 欧美日韩在线免费| 91tv亚洲精品香蕉国产一区7ujn| 中文字幕一区二区三区电影| 亚洲福利在线观看| 不卡av电影在线观看| 亚洲国产精品99久久| 欧美性猛xxx| 久久久视频在线| 亚洲最新av网址| 亚洲欧美国产制服动漫| 亚洲国产天堂久久综合网| 日韩激情av在线播放| 亚洲无限乱码一二三四麻| 91亚洲精华国产精华| 欧美日韩中文字幕| 亚洲欧洲激情在线| 精品亚洲国产成av人片传媒| 亚洲一区二区少妇| 亚洲品质视频自拍网| 亚洲第一精品夜夜躁人人爽| 亚洲人成在线播放| 国产精品一区二区三区免费视频| 狠狠躁夜夜躁人人爽天天天天97| 亚洲xxxxx性| 亚洲一区中文字幕在线观看| 色婷婷av一区二区三区在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美一区在线直播| 国产一区二区三区欧美| 国产精自产拍久久久久久| 国产精品久久久久99| 欧美在线一区二区三区四| 精品国产乱码久久久久久虫虫漫画| 欧美刺激性大交免费视频| 欧美乱人伦中文字幕在线| 亚洲精品资源在线| 国产精品欧美亚洲777777| 亚洲精品久久久久国产| 日韩电影在线观看永久视频免费网站| 欧美高清视频在线| 欧美激情亚洲另类| 国产一区二区三区久久精品| 亚洲精品国产成人| 日韩亚洲成人av在线| 久久中国妇女中文字幕| 成人国产在线视频| 美女视频黄免费的亚洲男人天堂| 欧美壮男野外gaytube| 欧美极品美女视频网站在线观看免费| 国产aⅴ夜夜欢一区二区三区| 97超视频免费观看| 米奇精品一区二区三区在线观看| 亚洲成人精品久久久| 亚洲a区在线视频| 中文亚洲视频在线| 一本大道久久加勒比香蕉| 欧美午夜精品久久久久久久| 精品久久久久久中文字幕大豆网| 欧美影院久久久| 欧美日韩一二三四五区| 萌白酱国产一区二区| 欧洲美女7788成人免费视频| 国产精品自拍小视频| 欧美性xxxxx极品| 国产亚洲福利一区| 中文字幕精品影院| 91精品国产91久久久久久吃药| 国产午夜精品视频免费不卡69堂| 欧美黄色www| 国产成人精品电影久久久| 国产精品欧美一区二区三区奶水| 久久综合久中文字幕青草| 欧美成人精品激情在线观看| 国产成人精品一区二区在线|