2016-08-10 66 views
1

我有一个函数与长if else条件来检查所有的细节是否有效。不过,我想优化if-else条件。迅速优化,如果其他条件

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

因为我想知道这种情况哪一部分是无效的,而且print出来,而不是做这一切在一起。例如,如果其他人有效,如果emailInput无效。

+0

如果COND1 {如果COND2 {打印( “OK”)}否则{打印( “COND2柯”)}否则{打印( “COND1 KO”)} – FredericP

+0

这取决于什么这是否意味着你“知道条件的哪一部分是无效的”。你可以将它分成六个函数来检查值并返回布尔值,例如:if emailInputOk()&& passwordOk()&& userNameInputOk ... etc和在这个函数中打印或做其他事情... – tosha

回答

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") 
} 
+0

它很好,干净也很容易阅读和理解 –

2

你可以做什么是存储通过该数组中的布尔阵列中的每个值,循环,然后打印if语句的结果:

let conditions = [(emailInput!.isEmailValid), (passwordInput!.isPasswordValid)...] 

var index = 0 

for condition in conditions{ 
    if(condition){ 
     print("Condition \(index) is true") 
     } 
    else{ 
     print("Condition \(index) is false") 
    } 
    index += 1 
} 

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

这样做也使得以后很容易添加条件。

+0

非常聪明的解决方案。 .. – tosha

0

,你将不得不单独检查所有条件:

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

你可以试一下像这样:

guard emailInput!.isEmailValid else 
{ 
print("email invalid") 
} 

guard passwordInput!.isPasswordValid else 
{ 
print("password is invalid") 
} 

guard usernameInput!.isUserNameValid else 
{ 
print("username invalid") 
} 

guard testConfirmedPwd else 
{ 
print("testConfirmedpwd error") 
} 

guard photoPick != "image1" else 
{ 
print("photo pick is not image1") 
} 

这使代码更具可读性并且不检查其他条件如果一个条件失败,则为ON

+0

是的!为什么我没有考虑使用警卫的形式....... –

0

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

let strErrorMessage : String = “.” 

if emailInput!.isEmailValid 
{ 
    strErrorMessage = “Invalid email ” + strErrorMessage 
} 
else 
{ 
    strErrorMessage = “Valid email ” + strErrorMessage 
} 

if passwordInput!.isPasswordValid 
{ 
    strErrorMessage = “Invalid password ” + strErrorMessage 
} 
else 
{ 
    strErrorMessage = “Valid password ” + strErrorMessage 
} 


if usernameInput!.isUserNameValid 
{ 
    strErrorMessage = “Invalid username ” + strErrorMessage 
} 
else 
{ 
    strErrorMessage = “Valid username ” + strErrorMessage 
} 

if testConfirmedPwd == true 
{ 
    strErrorMessage = “Invalid testConfirmedPwd ” + strErrorMessage 
} 
else 
{ 
    strErrorMessage = “Invalid testConfirmedPwd ” + strErrorMessage 
} 

if photoPick != "image1 
{ 
    strErrorMessage = “Invalid image ” + strErrorMessage 
} 
else 
{ 
    strErrorMessage = “Valid image ” + strErrorMessage 
} 

print(strErrorMessage) 
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