目錄 stride ,
self
, typealias , zip
###1>巧用 stride 迴圈
stride 是 Strideable 協議中定義的一個方法, 它可以按照指定的遞進值生成一個序列。可以用在 Swift 的迴圈語法結構中。定義如下:
public func stride(to end:Self, by stride:Self.Stride) ->StrideTo<Self>
public func stride(through end:Self, by stride:Self.Stride) ->StrideThrough<Self>
複製程式碼
這兩個方法的區別很簡單:(是否包含終點值)
for i in 0.stride(to:5, by:1) {
print(i)//0,1,2,3,4
}
for i in 0.stride(through:5, by:1) {
print(i)//0,1,2,3,4,5
}
複製程式碼
那在迴圈中可以怎麼用呢:
//(by:可以傳入迴圈的步長)
for i in 0.stride(through: 10, by: 3) {
print(i) //0,3,6,9
}
複製程式碼
這個寫法類似於 python 中的 for 迴圈寫法
for i in range(0,10,3):##(起始值,終止值, 步長)
print(i) ##0,3,6,9
複製程式碼
###2>神奇的self
問題來源
這兩天微博上也有討論詳見
###如果你的變數如果和 Swift 的關鍵字衝突的話,你可以使用' '包裹住變數名,這樣就可以用了
self.saveButton.action { [weak self] _ in
guard let `self` = self else { return }
//do something
}
複製程式碼
###3>typealias的一點小用法
之前寫過一篇來介紹 typealias的用法點選檢視
現在在專案中有一點小更新,讓typealias更加好用,用 private 來定義 typealias, 實現代理方法的分離,讓專案結構更加清晰
private typealias Delegate = ViewController
extension Delegate: UITableViewDelegate {
//delegate method
}
private typealias DataSource = ViewController
extension DataSource: UITableViewDataSource {
//dataSource method
}
複製程式碼
###4>zip函式的一點小小用法 首先看看 zip 函式是怎麼定義的
public func zip<Sequence1 : SequenceType, Sequence2 : SequenceType>(sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2>
複製程式碼
可以看到zip()函式接收兩個序列,並且返回一個Zip2Sequence型別的資料 但什麼是 zip2Sequence呢?還是來個小例子來說明吧
let a = [1,2,3]
let b = ["one", "two", "three"]
let c = zip(a, b)
複製程式碼
那麼 c的值什麼呢?
**▿ Swift.Zip2Sequence<Swift.Array<Swift.Int>, Swift.Array<Swift.String>>**
** ▿ _sequence1: 3 elements**
** - [0]: 1**
** - [1]: 2**
** - [2]: 3**
** ▿ _sequence2: 3 elements**
** - [0]: one**
** - [1]: two**
** - [2]: three**
複製程式碼
這樣我們就可以拼一個 dictionary
var dic: [String: Int] = [:]
for (i, j) in ccc {
dic[j] = i
}
**["one": 1, "three": 3, "two": 2]**
複製程式碼
現在跳出 swift, 來看看 python 中的 zip 函式
x=['one','two','three']
y=[80,90,95]
d=dict(zip(x,y))
**[('bob', 80), ('tom', 90), ('kitty', 95)]
複製程式碼
python 中的 zip 比 swift 簡便不少