Swift 入門指南 V1.00 - 單元 14 - Encrypt 類別




類別 (class) 為 Swift 開發軟體 (software) 的要角,因為類別用來設計物件 (object) ,軟體的實際運作則是藉由物件與物件的互動。我們接下來進入實際開發軟體的階段,最後會發展出一個 GUI 軟體



我們打算發展的一個替英文句子編密碼的軟體,主要功能是做小寫字母的替換,例如 "There is no spoon." 可能變成以下任一個


Tfqdq ki jo itooj.

Tcnan hf gl fqllg.

Tczmz dn ij nkjji.

Tgfsf pb ir barri.

Tdcpc my fo yxoof.


首先,我們要發展 Encrypt 類別,主要功能是建立一個英文小寫字母的對換表格,藉由這個表格,我們可以將英文句子中的小寫英文字母進行對換,最後開發成 Mac 上圖形使用者介面 (Graphical User Interface, GUI) 。


GUI 外觀如下圖



我們先聚焦在 GUI 上,有兩個供輸入的文字欄位 (text field) ,其中一個我們作為輸出的顯示訊息之用,另有三個標籤 (label) ,顯示文字的提示訊息,七個按鈕 (button) ,提供「新建」、「開啟」、「儲存」 Encrypt 物件,與「編碼」、「解碼」所輸入的英文句子,「清除」所有輸入欄位,以及「拷貝」輸出結果等的功能。


現在我們先來看看所有功能的核心,也就是 Encrypt 類別,我們的目的是,建立一個小寫英文字母的轉換表格,然後編碼、解碼都可直接依據這個表格。我們打算用下面的數學公式建立表格


y = a * x + b

m = y % n


英文小寫字母有二十六個,我們以英文小寫字母 a 在 ASCII 中的值為 97 開始算好了, x 帶入 ASCII 的值, ab 各是 09 的隨機數字,取得一組固定的 ab 值後,使 y 得到大於 97 的整數值,依序不同的英文小寫字母都會得到大於 97 的不同整數值。


接著再把每個數字除以 nn 就是英文小寫字母的數量,也就是 26 。這樣一來,就能得到 26 個從 025 不同的數字,餘數 0 就代表 a ,而餘數 1 代表 b ,餘下類推。然後就能依照這 26 個餘數構成的表格進行字母轉換,例如以下的表格


3, 0, 14, 5, ...


第一個數字是 3 ,對照是 a 的位置,因此 a 會被轉換成 d ,同理 b 被轉換成 ac 被轉換成 od 被轉換成 e 等等。


以下是預計開發的 Encrypt 類別


class Encrypt {
   // 英文小寫字母表
   let alphabet = "abcdefghijklmnopqrstwuvxyz"
   // 密碼表整數陣列
   var code = Array(arrayLiteral: 26)
 
   // 建構子
   init() {
      // setCode()
   }
 
   // 設定密碼表
   // func setCode() {}
 
   // 由字元從字母表中找到索引值
   // func findAlphabetIndex(chr: Character) > Int {}
 
   // 由字元從密碼表中找到索引值
   // func findCodeIndex(chr: Character) -> Int {}
 
   // 判斷是否為英文小寫字母的字元
   // func isLowercase(chr: Character) -> Bool {}
 
   // 由索引值找到密碼表中對應的字元
   // func findCode(number: Int) -> Character {}
 
   // 由索引值找到字母表中對應的字元
   // func findLetter(index: Int) -> Character {}
 
   // 進行編碼的方法
   // func toEncode(str: String) -> String {}
 
   // 進行解碼的方法
   // func toDecode(str: String) -> String {}
}

有兩個屬性 (property) , alphabet 為英文小寫字母表, code 則是密碼表的餘數陣列 (array) ,這裡都先指派初值


// 英文小寫字母表
let alphabet = "abcdefghijklmnopqrstwuvxyz"
// 密碼表整數陣列
var code = Array(arrayLiteral: 26)

此處的陣列 code 是由建構子 (initializer) 建立,裡頭只有放入數字 26

底下的方法 (method) 除了建構子外都加上 // ,這是註解化,使之變成註解 (comment) 沒有作用。建構子的內容為呼叫 setCode() ,由於 setCode() 還沒實作出來,因此這裡也先註解化。


下一個單元先來實作 setCode() ,產生密碼表陣列。


中英文術語對照


類別class
軟體software
物件object
圖形使用者介面graphical user interface
文字欄位text field
標籤label
按鈕button
屬性property
陣列array
建構子initializer
方法method
註解comment

沒有留言: