程序遷移到swift 3.0的一些實用技巧。本站提示廣大學習愛好者:(程序遷移到swift 3.0的一些實用技巧)文章只能為提供參考,不一定能成為您想要的結果。以下是程序遷移到swift 3.0的一些實用技巧正文
前言
在去年swift3.0發布了,新版本可以在Xcode 8中使用了,或者你可以直接從swift.org下載編譯器。
從代碼可讀性來看,新版本有很多提升,函數調用的連續性,更好的命名約定和移除了部分c風格的元素。
從代碼可讀性來來看,NS前綴已經從Foundation類型中移除,例如NSBundle.mainBundle()
現在改為Bundle.mainBundle()
.
c風格的一元操作符++和--在3.0中已經不適用了:
// Only in Swift 2.2 and earlier var number = 10 number++ ++number number-- --number
相對應的表達方式是number += 1 or number -= 1
.
另外一個有趣的變化是移除了c風格的for-loop,我記得在學校中(使用c語言)寫這種循環:
// Only in Swift 2.2 and earlier let steps = 5 for var step = 0; step < steps; step++ { print(step) } // 0 1 2 3 4
主要的原因是存在了更好的對應寫循環的方法for-in
和stride().for-loop
在理解上比較困難和缺少swift風格。當新的方法出現後,for-loop
已經很少在代碼庫中使用了。
這篇文章將講解典型的for-loop
使用場景,同時說明遷移到 for-in
, stride()
或者簡單的while() {}
.
一、如何遷移 for-loop 到 for-in
for-loop
應用的典型場景在一個數字區間內迭代。這些數字可以是數組的索引等.
例如,讓我們遍歷數組的每一個元素:
// Only in Swift 2.3 and earlier let 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++
的循環部分是冗長的。許多元素是多余的,整個表達式可以簡化的。替換為手動的增量,整個操作可以用更具表達性的語法來自動化。
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-lo
op的決定是合理的。
二、如何遷移 for-loop 到 stride
你可以合理地要求for-loop
雖然是冗長的,但仍然是靈活的。 它對於更復雜的迭代是有用的。
讓我們嘗試一個場景。你要打印一個具有奇數索引元素的元素數組。一個 for-loop
可能看起來像這樣:
// Only in Swift 2.3 and earlier let 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被遇到。可以使用C風格的for-loop
:
// Only in Swift 2.2 and earlier let 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 earlier func sum(firstItem: Int, secondItem: Int) -> Int { return firstItem + secondItem } sum(5, secondItem: 2) // => 7
對於我來說,這個忽略的做法給我帶來困擾。你不得不忽略第一個參數的標簽,然而剩下的參數卻還保持有標簽。這是一種不自然的規則。
幸運的是從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能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。