2016-04-08 24 views
0

この検証検証を処理するためのよりクリーンな方法があるのだろうか、特にブロックが3つある最後のセクションが疑問です。完全性のために、私はすべてのアラートが異なるメッセージを表示してと表示していると言っています。複数のフィールド検証を簡略化して簡略化

func fieldsAreValid() -> Bool { 
    let emailField = view.viewWithTag(0) as! UITextField 
    let passwordField = view.viewWithTag(1) as! UITextField 
    let verificationField = view.viewWithTag(2) as? UITextField 

    guard let email = emailField.text, 
     let password = passwordField.text else { 
      return false 
    } 

    let isEmail = email.isEmail 
    let isStrongPassword = password.isAStrongPassword 
    let isLoginOrValidSignup = !isASignup() || verificationField?.text == password 
    return isEmail && isStrongPassword && isLoginOrValidSignup 
} 

func validateForm() -> Bool { 
    let valid = fieldsAreValid() 
    if !valid { 
     // show alert 
    } 
    return valid 
} 

私は、これは常に動作するはずのものであるため、UITextField sの見解をキャストするas!を使用する方が良いと思う:

func fieldsAreValid() -> Bool { 
    guard let email = (view.viewWithTag(1) as? UITextField)?.text, 
    let password = (view.viewWithTag(2) as? UITextField)?.text else { 
     // show an alert 
     return false 
    } 

    if !email.isEmail { 
    // show an alert 
    return false 
    } 

    if !password.isAStrongPassword { 
    // show an alert 
    return false 
    } 

    if isASignUp() { 
    if let verification = (view.viewWithTag(3) as? UITextField)?.text { 
     if verification != password { 
     // show an alert 
     return false 
     } 
    } else { 
     // show an alert 
     return false 
    } 
    } 

    return true 
} 

答えて

0

は、ここで提案です。たとえば、タグ0のビューがUITextFieldではない場合は、開発中に見つかっている可能性があります。そのため、すぐにクラッシュすることもできます。

+0

実際には、verificationFieldはオプションで隠すことができるということを忘れてしまいました。だから、もし私がフィールドにログインしようとしていると、コードがクラッシュする原因となるnilが返されます。 –

+0

さて、コードを修正しました。今、verificationFieldはオプションです。また、 'verificationField.text == password'を' verificationField?.text == password'に変更しなければなりませんでした。 – tonisuter

+0

わかりました。でも、ユーザーのフィードバックはどうですか?あなたのソリューションで私は警告を表示することができないだろう。 –

0

スウィフトは、私がこのような場合のために使用するのが大好き素晴らしい機能を持って:

ガード声明ここ

非常に良い説明:お使いの場合にはhttp://ericcerney.com/swift-guard-statement/

私が書くでしょう:

func fieldsAreValid() -> Bool { 
    guard let email = (view.viewWithTag(0) as? UITextField)?.text, 
     let password = (view.viewWithTag(1) as? UITextField)?.text else { 
      // show an alert 
      return false 
     } 

guard email.isEmail else { 
    // show an alert 
    return false 
} 


guard password.isAStrongPassword else { 
    // show an alert 
    return false 
} 


if isASignUp() { 
    guard let verification = (view.viewWithTag(2) as? UITextField)?.text else { 
     // show an alert 
     return false 
    } 

guard verification == password else { 
    // show an alert 
    return false 
} 

//here your code if isASignUp is true 

} 

//here your code if it's a login ;) 

return true 

} 
+0

これは良い習慣ではないと思います。実際には、ブロックの最初または最後の2番目の命令として配置されることを意味します。 [link](http://ericcercerney.com/swift-guard-statement/) –