Swift 如何将文本字段限制为仅包含双值

Swift 如何将文本字段限制为仅包含双值,swift,xcode,fatal-error,swift5,xcode11,Swift,Xcode,Fatal Error,Swift5,Xcode11,所以本质上我正在创建一个计算器类型的应用程序,在其中我只想输入数字、小数和负号。对于XCODEL和SWIFT,我是相当新的,所以当我知道如何处理这些问题时,我不会考虑我的知识。 这是我目前试图解决的问题 let v = Double(inputOne.text!)! (inputOne.是关联的文本字段) 在我的算法中,当所有内容都按原样输入时,这一点效果很好,但是当输入有效双精度以外的任何内容时,我会收到“致命错误:在打开可选值时意外发现零”,应用程序崩溃 我想可能有人已经想出了一个创造性

所以本质上我正在创建一个计算器类型的应用程序,在其中我只想输入数字、小数和负号。对于XCODEL和SWIFT,我是相当新的,所以当我知道如何处理这些问题时,我不会考虑我的知识。 这是我目前试图解决的问题

 let v = Double(inputOne.text!)!
(inputOne.是关联的文本字段)

在我的算法中,当所有内容都按原样输入时,这一点效果很好,但是当输入有效双精度以外的任何内容时,我会收到“致命错误:在打开可选值时意外发现零”,应用程序崩溃


我想可能有人已经想出了一个创造性的解决方案来解决这个问题,或者Xcode中可能有一些命令以这种方式限制文本字段,但是我对Xcode是新手,不知道这些东西是否存在。也许有什么方法可以实现一条错误消息,只要输入了有效的double以外的内容,就会发生,而不会使应用程序崩溃?任何创造性的解决方案都将不胜感激

可以使用UITextView作为输入字段(如果需要单行输入,请使用textField)。然后,只需将ViewController设置为textView的委托-在ViewController中添加以下行(不要忘记继承UITextViewDelegate):

本质上,这允许ViewController拥有textView的一些功能。在这种情况下,我们对过滤用户输入感兴趣,为此,您可以使用以下功能:

/// Intercept whatever character the user is typing on the keyboard
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    // If the user presses "enter", handle it the way you want
    guard text.rangeOfCharacter(from: CharacterSet.newlines) == nil else {
        // Handle new line
    }
    // If character is a digit, a dot, or a dash, allow input, else reject it.
    if text == "-" || text.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil || text == "." {
        return true
    } else {
        return false
    }
}

这回答了你的问题吗?
/// Intercept whatever character the user is typing on the keyboard
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    // If the user presses "enter", handle it the way you want
    guard text.rangeOfCharacter(from: CharacterSet.newlines) == nil else {
        // Handle new line
    }
    // If character is a digit, a dot, or a dash, allow input, else reject it.
    if text == "-" || text.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil || text == "." {
        return true
    } else {
        return false
    }
}