備忘録
はじめに
ログイン機能を実装していると、ユーザーが入力したテキストの状態に応じてアプリも反応しなくてはいけない場面が出てくると思います。
例えば、
・何も入力していない時
・明らかに使えない文字が使われている時
など。
そういう書式チェックする事なんかをバリデーション
というのですが、今回はその実装方法を備忘録として書いていこうと思います。
実装コード
enum InputUserInfoValidationError: Error {
case textEmpty, invalidEmail, invalidPassword
init?(email: String?, password: String?) {
// メールアドレスが入力されていない時
guard
let email = email,
!email.isEmpty else {
self = .textEmpty
return
}
// パスワードが入力されていない時
guard
let password = password,
!password.isEmpty else {
self = .textEmpty
return
}
// [a-zA-Z0-9@._-]を除く文字を定数化
let okText = "[^a-zA-Z0-9@._-]"
// 明らかに使えない文字を使っている場合
if email.range(of: okText, options: .regularExpression, range: nil, locale: nil) != nil {
self = .invalidEmail
return
}
if password.range(of: okText, options: .regularExpression, range: nil, locale: nil) != nil {
self = .invalidPassword
return
}
// 何も問題なければnilを返す
return nil
}
// アラートのメッセージに使用する
var messege: String {
switch self {
case .textEmpty:
return "入力不備があります"
case .invalidEmail:
return "このメールアドレスは\n使えません"
case .invalidPassword:
return "このパスワードは\n使えません"
}
}
}
こんな風にユーザー入力の正当性を判断するバリデーションのロジックが書かれたファイル
を別に作ってあげます。
では呼び出す側のコードを実装していきましょう↓
※アラートはこの方法で実装していきます。
UIAlertControllerをファイルを分けて実装してみる
// ユーザーが入力したテキストを代入することでバリデーションが行われる
if let validationErrorMessage = InputUserInfoValidationError(email: userEmailTextField.text, password: userPasswordTextField.text)?.messege {
// エラー内容を表示する
Alert.okAlert(vc: self, title: validationErrorMessage, message: "")
return
}
呼び出す側はこのようになりました。
これで、代入されたテキストの状態に応じてエラー内容を表示することができますね。
おわりに
今回は、メンターにコードレビューして頂いた時に指摘された部分です。
私はMVCアーキテクチャを採用してアプリを開発しているのですが、Controllerにバリデーションの処理を書いていた
ことが問題でした。
Controllerの役割としてはViewやModelから貰ったデータから別のViewを表示させる
だけで、そのデータを処理して次にどのViewを出すのかという部分(ビジネスロジック
)はControllerは行いません。
なので今回のようにユーザーが入力したテキストの状態がどうなっているかを判断するビジネスロジック
は別ファイルで行い、アラートを表示する
という部分だけControllerが行っています。
うーん、これはもっと深くMVCアーキテクチャについて知る必要がありそうですね。