zip
zip 是 Swift 中的一個內建函數,用來將兩個序列(如陣列或字符串)配對組合。讓我詳細解釋一下:
zip 函數的作用
zip 會將兩個序列的元素一對一地配對起來,創建一個新的序列,其中每個元素都是一個元組 (tuple)。
簡單例子
let numbers = [1, 2, 3]
let letters = ["a", "b", "c"]
for (number, letter) in zip(numbers, letters) {
print("\(number): \(letter)")
}
// 輸出:
// 1: a
// 2: b
// 3: c
在我們的 Hamming 程式中的應用
for (char1, char2) in zip(dnaSequence, against) {
if char1 != char2 {
distance += 1
}
}
這裡 zip(dnaSequence, against) 會:
- 將
dnaSequence的第一個字符與against的第一個字符配對 - 將
dnaSequence的第二個字符與against的第二個字符配對 - 以此類推...
實際例子
假設我們有:
dnaSequence = "GAGC"against = "CATC"
zip(dnaSequence, against) 會產生:
- 第一輪:
char1 = "G",char2 = "C"→ 不同,distance = 1 - 第二輪:
char1 = "A",char2 = "A"→ 相同,distance 不變 - 第三輪:
char1 = "G",char2 = "T"→ 不同,distance = 2 - 第四輪:
char1 = "C",char2 = "C"→ 相同,distance 不變
最終結果:distance = 2
為什麼使用 zip?
使用 zip 比手動使用索引更安全、更簡潔:
// 使用 zip(推薦)
for (char1, char2) in zip(dnaSequence, against) {
// 比較字符
}
// 手動使用索引(較複雜且容易出錯)
for i in 0..<dnaSequence.count {
let char1 = dnaSequence[dnaSequence.index(dnaSequence.startIndex, offsetBy: i)]
let char2 = against[against.index(against.startIndex, offsetBy: i)]
// 比較字符
}
zip 讓程式碼更簡潔、更易讀,也避免了索引越界的風險。