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





































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







沒有留言:




















window.___gcfg = { 'lang': 'zh-TW' };





Popular posts from this blog

迅雷 Thunder 7.9.43.5054 免安裝版 (9.1.41.914 安裝版) - 支援BT下載的萬用 檔案下載工具

Nhiều đồn đoán cho rằng bộ đồ "phá vỡ quy tắc" của Meghan Markle được lấy cảm hứng từ trang phục của Công nương Diana

Cụ ông 92 tuổi gào khóc vì mất hết tiền tiết kiệm cả đời, càng cay đắng hơn khi kẻ trộm là đứa cháu trai 34 tuổi