今天群里有人問到了Swift中for…in遍歷字符串的問題,Interesting and learn about it.
我們知道,在Swift中,for……in的功能非常強大,那么該如何使用呢?
基本使用
首先我們寫出如下代碼:
let str = "1231312"
for i in str {
print(i)
}
系統提示了一個錯誤:
Type 'String' does not conform to protocol 'SequenceType'
我們可以看到,這個錯誤提示我們'String'沒有遵守'SequenceType'的協議。
那么'SequenceType'協議是什么呢?從官方文檔中我們可以看到Array和Dictionary都是遵守這個協議的,那么我們先看看Array和Dictionary的實現。
let a: Array = [1,2,3,4]
for i in a {
print(i)
}
let dic: [String: AnyObject] = ["a": 0, "b": 1, "c": 2]
for i in dic {
print(i)
}
運行結果如下:
1 2 3 4 ("b", 1) ("a", 0) ("c", 2)
我們發現String的characters的屬性是遵守這個協議的,所以:
let str: String = "Swift"
for i in str.characters {
print(i)
}
運行結果如下:
S w i f t
拓展使用
在查看官方文檔是,我們發現了這樣一段代碼:
enumerate()
Default Implementation
Returns a lazy SequenceType containing pairs (n, x), where ns are consecutive Ints starting at zero, and xs are the elements of base:
Declaration
@warn_unused_result func enumerate() -> EnumerateSequence<Self>
Discussion
for (n, c) in "Swift".characters.enumerate() {
print("(n): '(c)'")
}
0: 'S'
1: 'w'
2: 'i'
3: 'f'
4: 't'
這是什么意思呢?我們來跑一下代碼:
for (n, c) in str.characters.enumerate() {
print("\(n): '\(c)'")
}
for (n, c) in a.enumerate() {
print("\(n): '\(c)'")
}
for (n, c) in dic.enumerate() {
print("\(n): '\(c)'")
}
結果如下:
0: 'S' 1: 'w' 2: 'i' 3: 'f' 4: 't' 0: '1' 1: '2' 2: '3' 3: '4' 0: '("b", 1)' 1: '("a", 0)' 2: '("c", 2)'
可以看到,enumerate中記錄的是索引及其對應的值的字典。我們可以利用它拿到當前值及其索引。
Tip:
一般情況下,我們這樣遍歷一個字典:
for (k, v) in dic {
print("\(k) —— \(v)")
}
運行結果如下:
b —— 1 a —— 0 c —— 2