Swift 入門指南 V1.00 - 單元 18 - 編碼




編碼 (encoding) 需要用到轉換表格,我們利用陣列 (array) 儲存這個表格,簡單說,就是利用 Unicode 排列順序,相對到表格的對應關係



上圖是用了如下的表格


code = {'q''z''i''r''a',
        'j''s''b''k''t',
        'c''l''u''d''m',
        'v''e''n''w''f',
        'o''x''g''p''y',
        'h'}

實際上我們的表格是餘數陣列,這裡轉換成字元的方式講解。

我們先來想一想程式如何完成編碼工作,假設是對以下的字串 (string) 進行編碼


"There is no spoon."

首先, 'T' 不是英文小寫字母,因此跳過,然後 'h''e''r''e' 都是英文小寫字母,對照表格,需要轉換為 'b''a''n''a' ,接下來遇到一個空格字元 ' ' ,也跳過,然後 'i''s' 也都是英文小寫字母,需要轉換為 'k''w' ,餘下類推。


所以需要利用一個迴圈 (loop) 進行上述編碼工作,逐一檢查字串中的每一個字元 (character) 是否為英文小寫字母,我們將用以下 isLowercase() 方法 (method) 判斷該字元是否為英文小寫字母


// 判斷是否為英文小寫字母的字元
func isLowercase(chr: Character) -> Bool {
   for i in alphabet {
      if (chr == i) {
         return true
      }
   }
 
   return false
}

完整程式請參考「範例程式篇」的 Encrypt.swift

簡單講, isLowercase() 判斷參數字元是否為 alphabet 中的元素,如果該字元存在於 alphabet ,那就是英文小寫字母。


如果是英文小寫字母就開始進行編碼,第一件工作就是找到該字元在英文小寫字母表的順序,我們用以下的 findAlphabetIndex() 進行這件工作


// 由字元從字母表中找到索引值
func findAlphabetIndex(chr: Character) -> Int {
   var i = 0
   for c in alphabet {
      if chr == c {
         return i
      }
 
      i++
   }
 
   return 0
}

這個順序就是 code 中的索引值,由索引值取出 code 中的元素,也就是先前利用 setCode() 計算出的餘數,再藉由此餘數從 alphabet 找到相對應的字元,以上工作由 findCode() 來完成


// 由索引值找到密碼表中對應的字元
func findCode(number: Int) -> Character {
   let index = code[number]
   var i = 0
   for s in alphabet {
      if i == index {
         return s
      }
 
      i++
   }
 
   return Character("")
}

因此, toEncode() 藉由呼叫 isLowercase()findAlphabetIndex()findCode() 完成細部工作


// 進行編碼的方法
func toEncode(str: String) -> String {
   var newStr = ""
   for chr in str {
      if isLowercase(chr) {
         newStr.append(findCode(findAlphabetIndex(chr)))
      }
      else {
         newStr.append(chr)
      }
   }
   return newStr
}

toEncode() 中的 newStr 為暫存變數,初值設定為空字串 (empty string) ,然後利用字串的 append() 方法附加每個處理過字元,如果是英文小寫字母就進行編碼轉換,然後加入轉換後的密碼,反倒不是英文小寫字母就直接附加進去。


測試部分用 "There is no spoon" 來編碼看看,在 Playground 的結果如下



結果 OK ,下一個單元繼續實作解碼功能。


中英文術語對照


編碼encoding
陣列array
字串string
迴圈loop
字元character
方法method
空字串empty string

沒有留言: