3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ログイン機能を実装している時にはバリデーションしよう

Last updated at Posted at 2021-02-05

備忘録

はじめに

ログイン機能を実装していると、ユーザーが入力したテキストの状態に応じてアプリも反応しなくてはいけない場面が出てくると思います。

例えば、

・何も入力していない時

・明らかに使えない文字が使われている時

など。

そういう書式チェックする事なんかをバリデーションというのですが、今回はその実装方法を備忘録として書いていこうと思います。

実装コード

InputUserInfoValidationError.swift
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をファイルを分けて実装してみる

ViewController
// ユーザーが入力したテキストを代入することでバリデーションが行われる
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アーキテクチャについて知る必要がありそうですね。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?