1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIでバリデーションを簡単に実装できるライブラリを作った話

Posted at

はじめに

SwiftUIでフォームを作る際、バリデーション処理を毎回書くのが面倒だと感じたことはありませんか?

  • 入力中にリアルタイムでバリデーションしたい
  • 数値, メールアドレス, パスワード等のルールを毎回書きたくない
  • フォーカスが外れたタイミングでバリデーションしたい
  • 複数フィールドをまとめてバリデーションしたい

これらをSwiftUIで簡単に実現できるライブラリ ValidationLibrary を作りました!

デモ

シンプルな例 複数フィールド
phone_number sign_up_form

特徴

  • 宣言的なAPI
    • SwiftUIらしいモディファイアで直感的に記述
  • リアルタイムバリデーション
    • 入力中にリアルタイムで検証(debounce対応)
  • 豊富な組み込みルール
    • email, password, numeric, regex などを用意
  • カスタムルール対応
    • クロージャで独自のバリデーションロジックを定義可能
  • 複数フィールド管理
    • ValidationContainer で複数フィールドを一括管理 ( 単一フィールドはValidationStateで管理 )

インストール

Xcode の File → Add Package Dependencies から以下のURLを追加:

https://github.com/Ryosuke1025/ValidationLibrary

または Package.swift に追加:

dependencies: [
    .package(url: "https://github.com/Ryosuke1025/ValidationLibrary.git", from: "1.0.0")
]

使い方

基本的な使い方

例えば、以下のような実装で10〜11桁の数字のみを許可するバリデーションが実装できます。なお、デモを完全再現したい場合は、Quick Startをご参照ください!

import SwiftUI
import ValidationLibrary

struct PhoneNumberView: View {
    @State private var phoneNumber = ""
    @State private var validationState = ValidationState()

    var body: some View {
        VStack {
            TextField("Phone Number", text: $phoneNumber)
                .keyboardType(.phonePad)
                .validation(
                    text: $phoneNumber,
                    state: validationState,
                    rule: .numeric(minLength: 10, maxLength: 11)
                )

            if validationState.hasBeenValidated {
                Text(validationState.isValid ? "Valid" : "Invalid")
                    .foregroundStyle(validationState.isValid ? .green : .red)
            }
        }
    }
}

複数フィールドの管理

ValidationContainer を使うと、複数のフィールドをまとめて管理できます。なお、デモを完全再現したい場合は、Advanced Usageをご参照ください!

struct SignUpForm: View {
    @State private var email = ""
    @State private var password = ""
    @State private var container = ValidationContainer()

    var body: some View {
        VStack {
            TextField("Email", text: $email)
                .validation(
                    text: $email,
                    container: container,
                    id: "email",
                    rule: .email
                )

            SecureField("Password", text: $password)
                .validation(
                    text: $password,
                    container: container,
                    id: "password",
                    rules: [.required, .password(minLength: 8)]
                )

            Button("Register") {
                container.validateAll()
                if container.isFullyValid {
                    // 登録処理
                }
            }
        }
    }
}

動作環境

  • iOS 17.0+ / macOS 14.0+ / watchOS 10.0+ / tvOS 17.0+
  • Swift 6.0+
  • Xcode 16.0+

おわりに

SwiftUIでバリデーションをシンプルに実装できるライブラリを紹介しました。

ぜひ使ってみてください!フィードバックやスターを頂けると励みになります!

使い方の詳細は、READMEに記載しております🙏

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?