Swift优化if else条件

时间:2016-08-10 05:23:40

标签: swift

我有一个if if else条件的函数来检查所有细节是否有效。但是,我想优化if-else条件。

if emailInput!.isEmailValid && passwordInput!.isPasswordValid && usernameInput!.isUserNameValid && testConfirmedPwd == true && photoPick !=  "image1" {
    print("valid")
} else {
    print("not valid")
}

因为我想知道条件的哪一部分无效,print它不是一起完成的。例如,如果其他人有效,则emailInput无效。

6 个答案:

答案 0 :(得分:2)

你可以做的是将每个值存储在一个布尔数组中,然后循环遍历该数组,然后打印if语句的结果:

if(someList.get(0)!=null)

您还可以将其链接到存储名称的单独数组,并使用索引从该数组中取一个名称,以便您知道条件名称,而不仅仅是数字。

这样做也可以让以后添加条件变得非常容易。

答案 1 :(得分:2)

要知道条件的哪一部分失败,您可以单独检查每个案例并做出相应的反应:

if !emailInput!.isEmailValid {
    // Invalid email
} else if !passwordInput!.isPasswordValid {
    // Invalid pwd
} else if !usernameInput!.isUserNameValid {
    // Invalid username
} else if !testConfirmedPwd {
    // Invalid pwd
} else if photoPick == "image1" {
    // Invalid image
}else{
    print("valid")
}

答案 2 :(得分:1)

这样做的一个明确方法是为每个配置都有一个guard语句。像这样:

guard emailInput.isEmailValid else { print("Email is invalid") } 
guard passwordInput.isPasswordValid else { print("Password is invalid") } 
.
.
.
print("Valid")

另一种很酷的方法是使用元组。像:

typealias Condition = (isValid: Bool, name: String)

let conditions: [Condition] = [
    (emailInput.isEmailValid, "Email"),
    (passwordInput.isPasswordValid, "Password"),
    .
    .
]

let isInputValid = conditions.reduce(true) { (aggregate, condition) -> Bool in
    if !condition.isValid { print("Invalid \(condition.name)") }
    return aggregate && condition.isValid
}

guard isInputValid else { return }
// handle valid input now

这允许检查所有条件,而不仅仅是在第一个无效条件下退出。输出如下:

    Invalid Password
    Invalid Date of birth

答案 3 :(得分:0)

您必须分别检查所有条件:

@post = Post.create(content: "nice day we are having")

@user = User.find(2)

答案 4 :(得分:0)

您可以尝试这样的事情:

    try{
    obj.setRepository(repositoryMock);
        Mockito.when(repositoryMock.getView("promotion")).thenReturn(promotionViewMock);
}catch(Exception e) {

}

这使得代码更具可读性,并且在一个条件失败时不检查其他条件

答案 5 :(得分:0)

为此目的,您必须分别检查每个条件,并为每个条件更新字符串或标志,以了解它是否有效。

void Start()
{
    choices = new string[50]; //This should fix it
    Dialoguer.events.onStarted += onStarted;
    Dialoguer.events.onEnded += onEnded;
    Dialoguer.events.onTextPhase += onTextPhase;
}