Приложение вылетает при попытке скопировать текст на iPhone - PullRequest
0 голосов
/ 11 июля 2020

Я программирую «приложение для шифрования», которое просто шифрует тексты. Это код:

let smallLetters: String = "abcdefghijklmnopqrstuvwxyz"
let bigLetters: String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

let input: String = encryptTextField.text!
    
    encryptTextField.text! = ""
    
    var value: String = ""
    
    for c in input {
        let otherChars: String = " !§$%&/()=?´`#+'*-_.:,;<>^°@€{}≠¿|][¢¶“¡≤≈ç√∫~µ@€öäüÜÖÄ"
        
        for i in otherChars {
            if c == i {
                value += String(i)
                print("i")
            }
        }
        
        var dCount: Int = 0
        var eCount: Int = 0
        
        var dFound: Bool = false
        var eFound: Bool = false
        
        for d in smallLetters {
            if !dFound {
                if c == d {
                    dFound.toggle()
                    
                    let y: Int = smallCount - dCount
                    var z: Int = 1
                    
                    for i in smallLetters {
                        if y == z {
                            print("[\(c) -> \(i)]")
                            value += String(i)
                        }
                        
                        z += 1
                    }
                } else {
                    dCount += 1
                }
            }
        }
        for e in bigLetters {
            if !eFound {
                
                if c == e {
                    eFound.toggle()
                    
                    let y: Int = bigCount - eCount
                    var z: Int = 1
                    
                    for i in bigLetters {
                        if y == z {
                            print("[\(c) -> \(i)]")
                            
                            value += String(i)
                        }
                        
                        z += 1
                    }
                } else {
                    eCount += 1
                }
            }
        }
    }
    
    let maximumChars: Int = 15
    
    var string: String = ""
    var i: Int = 1
    
    var b: Bool = false
    
    for c in value {
        if !b {
            if i <= maximumChars {
                string += String(c)
            } else {
                string += "..."
                b = true
            }
            
            i += 1
        }
    }
    
    let alert: UIAlertController = UIAlertController(title: "Encoded!", message: "Your input is now encrypted / decrypted.", preferredStyle: UIAlertController.Style.alert)
    let cancel: UIAlertAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel, handler: { (alert: UIAlertAction!) in
        self.encryptTextField.text! = value
        print("OK")
        
        self.encryptTextField.placeholder = "Enter a text to encrypt..."
    })
    let copy: UIAlertAction = UIAlertAction(title: "Copy!", style: UIAlertAction.Style.default, handler: { (alert: UIAlertAction!) in
        print("Copy!")
        
        let pasteboard: UIPasteboard = UIPasteboard.general
        pasteboard.string! = value
        
        self.encryptTextField.placeholder = "'" + string + "' was copied!"
    })
    
    alert.addAction(cancel)
    alert.addAction(copy)
    
    present(alert, animated: true, completion: nil)

Чтобы я мог быстро вставить зашифрованный текст в другое приложение (например, WhatsApp), я использую этот код (упрощенный):

let pasteboard: UIPasteboard = UIPasteboard.general
pasteboard.string! = "Hello World!"

Код работает в симуляторе: зашифрованный текст копируется, и я могу вставить его двойным щелчком (см. рисунок).

Вставить зашифрованный текст двойным щелчком

Но когда Я запускаю приложение на своем мобильном телефоне (iPhone 8), приложение вылетает в этот момент!

Кто-нибудь знает решение или хотя бы знает почему?

1 Ответ

2 голосов
/ 11 июля 2020

Решение состоит в том, чтобы не распаковывать необязательные переменные в коде принудительно.
Я настоятельно рекомендую узнать больше о Optionals в Swift здесь .

let input: String = encryptTextField.text!
Текст в UITextField может быть нулевым. Тип данных - необязательная строка (String?)

Вместо приведенных выше используйте операторы if let для безопасного развертывания опций!

if let input = encryptTextField.text{
   // Your logic/code to process input as String goes here
}

Точно так же вы можете удалить принудительное развертывание ("!") сделано здесь.
1. encryptTextField.text! = "". Просто введите encryptTextField.text = ""
2. pasteboard.string! = value Вы можете удалить выполненное здесь принудительное разворачивание ("!").
3. pasteboard.string! = "Hello World!"

Обычно принудительное развертывание переменных выполняется только в том случае, если вы точно знаете, что значение, которое содержит необязательная переменная, не равно нулю!

Принудительное развертывание дополнительных переменных, содержащих нулевое значение, приведет к cra sh ваше приложение!

...