2016-08-10 89 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