Шифр Цезаря по ошибке Свифта с расшифровкой - PullRequest
0 голосов
/ 16 февраля 2019

Я делаю заявку на доклад на тему безопасности системы. Цезарь быстрый код.и я столкнулся с проблемой, находясь в фазе дешифрования.

Когда я ввожу ключ, программа случайным образом выбивает ошибку:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Или ошибка выхода из массива

Я новичок.Пожалуйста, объясните мне, как я могу исправить эту ошибку и заставить мою программу работать должным образом.

Google не помог мне.

import UIKit

class CaesarCipher: UIViewController {
    @IBOutlet weak var messageText: UITextField!
    @IBOutlet weak var keyText: UITextField!
    @IBOutlet weak var cipherTextLabel: UILabel!

    ////////////////////////////////////////////////////////////////////////////

    @IBOutlet weak var cryptMessageText: UITextField!
    @IBOutlet weak var cryptKeyText: UITextField!
    @IBOutlet weak var decryptTextLabel: UILabel!

    @IBAction func cipherButton(_ sender: Any) {

        if (messageText.text == "") || (keyText.text == "")
        {
            let alert = UIAlertController(title: "Ошибка", message: "Одно, или несколько полей пустые", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Ок", style: .default, handler: nil))
            self.present(alert, animated: true)
        }
        else
        {
            let key = keyText.text
            let e: Int32 = Int32.init(key!)!
            //let upKey: Int32 = Int32.init(&e)

            let messageCipher = messageText.text
            // var i: Int8 = Int8.init(messageCipher!)!
            //let up: UnsafeMutablePointer<Int8> = UnsafeMutablePointer<Int8>.init(&i)

            //cipherTextLabel = encrypt(up, e)
            let encryptText = cipher(messageCipher!, shift: Int(e))
            cipherTextLabel.text = "\(encryptText)"
        } 
    }

    //////////////////////////////////////////////////////////////////////////////////////////////

    @IBAction func decryptButton(_ sender: Any) {

        if (cryptMessageText.text == "") || (cryptKeyText.text == "")
        {
            let alert = UIAlertController(title: "Ошибка", message: "Одно, или несколько полей пустые", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Ок", style: .default, handler: nil))
            self.present(alert, animated: true)
        }
        else
        {
            let cryptKey = cryptKeyText.text
            let e: Int = Int.init(cryptKey!)!
            //let upKey: Int32 = Int32.init(&e)

            let decryptMessageText = cryptMessageText.text
            // var i: Int8 = Int8.init(messageCipher!)!
            //let up: UnsafeMutablePointer<Int8> = UnsafeMutablePointer<Int8>.init(&i)

            //cipherTextLabel = encrypt(up, e)
            let decryptText = decipher(decryptMessageText!, shift2: Int(e))
            decryptTextLabel.text = "\(decryptText)"
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.hideKeyboard()
    }
}

func cipher( _ text:String, shift:Int ) -> String {

    var textCharArray:[Character] = Array( text.characters )

    let alphabet = Array("0123456789abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ !".characters);

    let offset = alphabet.count // alphabet.length in other languages

    for i in 0 ..< text.characters.count {

        let oldChar = textCharArray[ i ]
        let oldCharIdx = alphabet.index( of:oldChar ) // get index of

        let oldCharIdxUnwrapped = oldCharIdx // oldCharIdx can be null!
        let newCharIdx = ( oldCharIdxUnwrapped! + shift + offset ) % offset

        let newChar = alphabet[ newCharIdx ]

        textCharArray[ i ] = newChar
    }

    return String( textCharArray )
}

func decipher( _ text:String, shift2:Int ) -> String {

    // when calling a function you don't have to specify the first argument...
    // For other arguments you have to specify it!
    return cipher( text, shift:shift2 * -1 )
}

1 Ответ

0 голосов
/ 21 февраля 2019

Ошибка, которую вы видите, обычно появляется, когда есть Optional (значение, которое может быть ноль), и вы пытаетесь развернуть его (используя '!').

Swift также вводит дополнительные типы, которые обрабатывают отсутствие значения.Необязательные говорят, что «есть значение, и оно равно x» или «нет значения вообще».

Тем не менее, проблема здесь в том, что UITextfields, когда "empty" может иметь nil для своего свойства text.поэтому, когда вы делаете

    let key = keyText.text
    let e: Int32 = Int32.init(key!)!

key, может быть нулевое значение.И (nil)! приведет к Unexpectedly found nil while unwrapping an Optional value.

. Чтобы это исправить, я предлагаю вам добавить нулевую проверку для свойства text вашего UITextfield или изменить свой блок if else на следующий

    if let key = keyText.text, let messageCipher = messageText.text, !key.isEmpty, !messageCipher.isEmpty {
        // key and messageCipher are neither nil nor empty.
    } else {
        // keyText.text or messageText.text are either nil or empty
    }

Если вы заинтересованы в быстром программировании и создании приложений для iOS, я предлагаю вам больше узнать о том, как быстро работает с optional s и неявно развернутыми опциями.Место для начала будет https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html и последующие уроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...