Skip to main content

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 讓程式碼更簡潔、更易讀,也避免了索引越界的風險。