Swift 入門指南 V1.00 - Encrypt.swift




Encrypt.swift


//
//  Encrypt.swift
//  EncryptCommandLine
//
//  Created by 張凱慶 on 2015/3/4.
//  Copyright (c) 2015年 張凱慶. All rights reserved.
//

import Cocoa

class Encrypt: NSObject, NSCoding {
    // 英文小寫字母表
    let alphabet = "abcdefghijklmnopqrstwuvxyz"
    // 密碼表整數陣列
    var code = Array(arrayLiteral: 26)
    
    // 建構子改寫自 NSObject
    override init() {
        super.init()
        setCode()
    }
    
    // NSCoding 的建構子
    required init(coder decoder: NSCoder) {
        super.init()
        alphabet = decoder.decodeObjectForKey("alphabet") as String
        code = decoder.decodeObjectForKey("code") as Array
    }
    
    // NSCoding 的方法
    func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(alphabet, forKey: "alphabet")
        encoder.encodeObject(code, forKey: "code")
    }
    
    // 設定密碼表
    func setCode() {
        var a = 0
        var b = 0
        // a 必須是奇數
        while a % 2 == 0 {
            a = Int(arc4random() % 10)
            b = Int(arc4random() % 10)
        }
        var c = 97
        var i: Int, x: Int, y: Int, m: Int
        // 以迴圈取得每一個餘數
        for i = 0; i < 26; i++ {
            x = c
            y = x * a + b
            m = y % 26
            code.append(m)
            c++
        }
        
        // 移除第一個預設值
        code.removeAtIndex(0)
    }
    
    // 由字元從字母表中找到索引值
    func findAlphabetIndex(chr: Character) -> Int {
        var i = 0
        for c in alphabet {
            if chr == c {
                return i
            }
            
            i++
        }
        
        return 0
    }
    
    // 由字元從密碼表中找到索引值
    func findCodeIndex(chr: Character) -> Int {
        var n = findAlphabetIndex(chr)
        var i = 0
        for d in code {
            if d == n {
                return i
            }
            
            i++
        }
        
        return -1
    }
    
    // 判斷是否為英文小寫字母的字元
    func isLowercase(chr: Character) -> Bool {
        for i in alphabet {
            if (chr == i) {
                return true
            }
        }
        
        return false
    }
    
    // 由索引值找到密碼表中對應的字元
    func findCode(number: Int) -> Character {
        let index = code[number]
        var i = 0
        for s in alphabet {
            if i == index {
                return s
            }
            
            i++
        }
        
        return Character("")
    }
    
    // 由索引值找到字母表中對應的字元
    func findLetter(index: Int) -> Character {
        var i = 0
        for s in alphabet {
            if i == index {
                return s
            }
            
            i++
        }
        
        return Character("")
    }
    
    // 進行編碼的方法
    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
    }
    
    // 進行解碼的方法
    func toDecode(str: String) -> String {
        var newStr = ""
        for chr in str {
            if isLowercase(chr) {
                newStr.append(findLetter(findCodeIndex(chr)))
            }
            else {
                newStr.append(chr)
            }
        }
        return newStr
    }
}

the end

沒有留言: