-2

我在追书

IOS 编程:大书呆子牧场指南

我正在创建一个将华氏温度转换为摄氏温度的简单应用程序,最后的挑战是防止用户输入字母字符,这是我的尝试。

func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {

        let allowedCharacters = CharacterSet.decimalDigits
        let characterSet = CharacterSet(charactersIn: string)
        return allowedCharacters.isSuperset(of: characterSet)

        let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
        let replacementTextHasDecimalSeparator = string.range(of: ".")

        if existingTextHasDecimalSeparator != nil,
            replacementTextHasDecimalSeparator != nil{
            return false
        }else{
            return true
        }

    }

它有效,但我收到一条警告说“返回后的代码将永远不会被执行”有没有更好的方法来防止这个警告?先感谢您!

4

2 回答 2

1

警告,

'返回后的代码永远不会被执行

本身是不言自明的,编译器已经对你的代码进行了分析,并告诉你下面的任何内容return allowedCharacters.isSuperset(of: characterSet)都不会被执行。

正如您所说:它有效,但我收到一条警告说“返回后的代码将永远不会被执行”有没有更好的方法来防止这个警告?

Ans:要删除此警告,只需删除此语句下方的整个代码return allowedCharacters.isSuperset(of: characterSet),警告将被删除。

如果您正在寻找更好的方法,我会推荐以下方法,会有比这更好的方法,但我不知道。

顺便提一句,

实现功能,即阻止用户输入文本。您可以简单地更改键盘类型,

textField.keyboardType = .decimalPad // this only works in iPhone not in iPad

由于更改键盘类型仅适用于iPhone但不适用,iPad因此最好textfieldtextfield委托方法中实现允许的字符,shouldChangeCharactersIn如下所示,

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

let inverseSet = NSCharacterSet(charactersIn:".0123456789").inverted // characters you want to allow in textfield

let components = string.components(separatedBy: inverseSet)

let filtered = components.joined(separator: "")

return string == filtered

}
于 2017-05-31T17:34:57.033 回答
0

错误消息说:

返回后的代码永远不会被执行

这基本上意味着无论何时添加return语句,都不会执行该语句之后的代码。

警告来自这一行:

return allowedCharacters.isSuperset(of: characterSet)

我认为您不需要下面的代码,因为在该函数中我敢打赌您只想返回允许的字符,否则返回 false。

于 2017-05-31T17:05:59.573 回答