Как объединить 2 бура вместе в Swift 4 - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать проверку электронной почты, которая проверяет, где есть символ @ в письме и символы до и после @. Я могу это сделать, но я не могу соединить их вместе. Пока у меня есть вычисляемое свойство, которое просто проверяет, содержит ли электронная почта @. Как я могу объединить это вместе, чтобы проверить все условия.

extension String {

    var isEmailFormat: Bool {
        if let range = self.range(of: "@") {
            _ = self[(self.startIndex)..<range.lowerBound]
            _ = self[range.upperBound...]
        }
        return self.contains("@")
    }
}


if !self.emailField.text!.isEmailFormat {
                self.addErrorMessage("Invalid email address")
}

Ответы [ 4 ]

0 голосов
/ 14 января 2019
    //Iam using Custom validator 
         func validatorEmail(TF1:UITextField,errorMsg:String = validatorConstants.errorMsg ,errorMsgEmail:String = validatorConstants.emailMsg,fieldName:String = "Email" ) -> Bool {
            var error = validatorConstants.errorMsg
            if fieldName.count > 0 {
              error = validatorConstants.customMsg + fieldName
            }

            if  TF1.text?.isEmpty == true{
             // Any Notification
              return false
            }
            if  TF1.text?.isValidEmail == false{
              // Any Notification
              return false
            }
            return true
          }


  var isValidEmail: Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: self)
}   

              // call  this function as
       guard validator.validators(TF1: self.txtfied,fieldName: "FirstName") == false
          else {
           return
            }
0 голосов
/ 14 января 2019

Попробуйте вот так

var isEmailFormat: Bool {
    if let range = self.range(of: "@"),
       range.lowerBound > self.startIndex,
       range.upperBound < self.endIndex {
        return true
    } else {
        return false
    }
}

Логика удаления логики содержимого

Если сама строка не содержит символа @, то range будет сознательно nil. Так что не требуется в этом случае.

0 голосов
/ 14 января 2019

В таких случаях лучше использовать регулярное выражение.

func isValidEmail(testStr:String) -> Bool {        
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: testStr)
}

Если вы хотите использовать 2 логических значения, используйте оператор возврата, например

возвращаемое условие1 && условие2

но я предполагаю, что вы уже знаете это.

0 голосов
/ 14 января 2019

Дополнительные (логические) предложения отделяются от необязательного связывания запятой :

if let range = self.range(of: "@"), condition1, condition2 { ... }

Тем не менее, присвоение среза _ ничего не проверяет, оно должно выглядеть примерно так:

var isEmailFormat: Bool {
    if let range = self.range(of: "@"),
        range.lowerBound > startIndex,
        range.upperBound < endIndex {
        return true
    } else {
        return false
    }
}

В качестве альтернативы:

var isEmailFormat: Bool {
    if let range = self.range(of: "@") {
        return range.lowerBound > startIndex && range.upperBound < endIndex
    } else {
        return false
    }
}
...