Swift 文本字段结合了两个功能

Posted

技术标签:

【中文标题】Swift 文本字段结合了两个功能【英文标题】:Swift text field combine two functions 【发布时间】:2017-02-12 21:48:42 【问题描述】:

您好,我的文本字段函数有以下代码,它只允许数字、点且总共不超过 7 个字符:

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

    let length = ((textField.text?.characters.count)! + string.characters.count)
    if (length > 7)
    
        return false
    
    else
    
     //   return true
        let inverseSet = NSCharacterSet(charactersIn:".0123456789").inverted
        let components = string.components(separatedBy: inverseSet)
        let filtered = components.joined(separator: "")
        return string == filtered && true
    
    

现在我在这个网站上发现了另一个很好的代码,它只允许一个十进制字符:

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


    if(string == "." )
        let countdots = textField.text!.components(separatedBy: ".").count - 1

        if countdots > 0 && string == "."
        
            return false
        
    
    return true


我正在努力思考如何将这些东西组合成一个功能?不断出错..也许有人可以建议?

【问题讨论】:

您能否包含您尝试过的不断给您错误的代码? 您有多种选择,您可以将代码作为附加的if-else 语句包含在内,或者将每个条件设为自己的方法(返回Bool)并使用一系列guard 语句来确定它们是成功还是失败,或者您可以使用protocol 来定义一系列条件,然后您可以循环遍历这些条件。在任何情况下,您都需要决定要采取的优先顺序 你能举例说明如何实现“else if”但保持相同的返回 true/false 吗?或者我可以有几个返回真/假? 【参考方案1】:

它们可以使用基本控制流进行组合(否则)。

顺便说一句,return string == filtered && true 这行写得不好。如果 string == 过滤,它将返回 true,如果 string !=过滤,它将返回 false。因此,&& 子句是无用的添加。改写为return string == filtered

考虑到这一点,这里是清理你的函数:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
    let length = ((textField.text?.characters.count)! + string.characters.count)
    if (length > 7) 
        return false
    
    else if(string == "." ) 
        let countdots = textField.text!.components(separatedBy: ".").count - 1
        if countdots > 0 && string == "." 
        return false
        
        return true
    
    else
    
     // return true if the string is equivalent after removing all non-numbers (and therefore consisted of only numbers)
        let inverseSet = NSCharacterSet(charactersIn:".0123456789").inverted
        let components = string.components(separatedBy: inverseSet)
        let filtered = components.joined(separator: "")
        return string == filtered
    

【讨论】:

它不起作用,在最后一个“else”处出现错误。 - 预期声明 请再试一次。有一个额外的括号。 @KirillC 感谢 Faris,非常感谢您的回答。 没问题。干杯!

以上是关于Swift 文本字段结合了两个功能的主要内容,如果未能解决你的问题,请参考以下文章

无法在 SWIFT 中使用 UipickerView 委派文本字段

swift涂鸦功能的实现包括截图,画板封装,文本编辑,分享功能,橡皮擦功能,马赛克技术

三个文本字段值的总和,无需单击按钮(Swift - Xcode)

添加到文本字段的 Swift Gesture 识别器在成为第一响应者后无法操作?

SWIFT:从文本字段格式化为日期不起作用

无法通过单击选择文本字段(Swift)