【问题标题】:&& operator doesn't work in Swift3&& 运算符在 Swift3 中不起作用
【发布时间】:2018-02-26 13:11:50
【问题描述】:

我正在使用 Objective-C TextFieldValidator(https://github.com/dhawaldawar/TextFieldValidator) 自定义类来验证我的应用程序中的文本字段,它具有验证正则表达式的功能:

 -(BOOL)validate{
    if(isMandatory){
        if([self.text length]==0){
            [self showErrorIconForMsg:strLengthValidationMsg];
            return NO;
        }
    }
    for (int i=0; i<[arrRegx count]; i++) {
        NSDictionary *dic=[arrRegx objectAtIndex:i];
        if([dic objectForKey:@"confirm"]){
            TextFieldValidator *txtConfirm=[dic objectForKey:@"confirm"];
            if(![txtConfirm.text isEqualToString:self.text]){
                [self showErrorIconForMsg:[dic objectForKey:@"msg"]];
                return NO;
            }
        }else if(![[dic objectForKey:@"regx"] isEqualToString:@""] && [self.text length]!=0 && ![self validateString:self.text withRegex:[dic objectForKey:@"regx"]]){
            [self showErrorIconForMsg:[dic objectForKey:@"msg"]];
            return NO;
        }
    }
    self.rightView=nil;

    return YES;
}

现在在我的 UIViewController 中,我正在使用以下 if 语句来验证我从注册表单中的此自定义 TextFieldValidator 继承的所有文本字段:

tfFirstName.isMandatory = true
tfLastName.isMandatory = true

if (tfFirstName.validate() && tfLastName.validate()){
   return true
}else{
   return false
}

tfLastName 字段为空白,但似乎 if 语句仅调用 tfFirstName.validate() 并始终返回 true &amp;&amp; 运算符在这里不起作用。 在 Objective-C && 中工作正常,但在 Swift 3 中却不是。为什么&amp;&amp; 操作符在这里不起作用,解决办法是什么?

【问题讨论】:

  • 请分享 validate() 函数
  • minimal reproducible example 会很有帮助。
  • tfLastName.validate() 只有在tfFirstName.validate() 为真时才会被调用。如果对validate 的两个调用都为真,则整个if 只会返回真。你怎么知道没有拨打validate 的电话?您确定tfLastName 没有引用与tfFirstName 相同的文本字段吗?
  • 这绝不是语言的错。它始终是您自己的代码。
  • 如果textfield.textnil,您的验证函数会返回true——不确定这是否真的会发生,因为默认值(根据文档)是""——试试return (textfield.text?.characters.count ?? 0) &gt; 0 代替

标签: swift binary-operators


【解决方案1】:

当 text 为 nil 时,您的 validate() 函数返回 YES。在 swift 中, UITextfield.text 可以产生一个 nil 值。将验证函数的第一部分更改为...

    if(isMandatory){
        if(self.text == nil || [self.text length]==0){
            [self showErrorIconForMsg:strLengthValidationMsg];
            return NO;
        }
    }

【讨论】:

    【解决方案2】:

    请检查您的代码,&& 正在按预期工作..

    func validate(_ textfield:UITextField) -> Bool{
        if textfield.text?.characters.count == 0{
            return false
        }else{
            return true
        }
    }
    
    func testValidate(){
    
        let tfFirstName = UITextField()
        tfFirstName.text = "fhgghh"
    
        let tfLastName = UITextField()
        tfLastName.text = ""
    
    if (validate(tfFirstName) && validate(tfLastName)){
            NSLog("true")
        }else{
            NSLog("false")
        }
    }
    
    testValidate()
    

    控制台:: 2017-09-18 11:54:08.796 MyPlayground2[22908:2591237] false

    【讨论】:

    • 声明您无法重现问题中描述的问题并不是答案。 (来自meta.stackoverflow.com/a/277924/1187415
    • 之前我回答的问题样本不同,现在不同了。在你的回复中,“不是答案”将适用于所有问题。如果你打否定回答谁在尝试帮助..不会有任何帮助..不要气馁..
    【解决方案3】:

    我通过如下修改我的代码来解决我的问题:

    let isValidFirstName = tfFirstName.validate()
    let isValidLastName = tfLastName.validate()
    if (isValidFirstName && isValidLastName)){
       return true
    }else{
       return false
    }
    

    【讨论】:

    • 如果此代码解决了您的问题,那么使用 if validate(tfFirstName) &amp;&amp; validate(tfLastName) { 也可以。
    • 另外,这不会编译(括号不匹配),所以它不能是你的真实代码。
    • @rmaddy:在否决或发表评论之前,您是否尝试过重现我的问题?我不是在这里发布我的查询以获得否决票,而是我认真地解决了这个问题。至少尝试一次这个问题,然后做出反应。
    • @MS_iOS 不要假设谁投反对票,因为不是我。
    猜你喜欢
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2022-06-21
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多