Swiftでバリデーションを実装する(SwiftCop編)

Swiftでバリデーションを実装する(SwiftCop編)

検証環境

  • Swift3.0.2

昨日Swiftでバリデーションを実装していたのですが、SwiftCopという良いライブラリを発見したので紹介します。
Swiftのバリデーション界隈ですでに知れ渡っていたらすいません。

https://github.com/andresinaka/SwiftCop/tree/master/SwiftCop

Swift3に対応していて、ソースコードは以下の3つのファイルから構成されていて、行数も少なくシンプルなものです。

  • Suspect.swift
  • SwiftCop.swift
  • Trial.swift

いまのところCocoaPodsのみ対応しており、Carthageの対応はIssueが立っているのですが、試したところうまくいきませんでした。

アイコンがなんとも言えない雰囲気を醸しだしていて、Exampleのgifアニメにもそのアイコンが使われているのでアイコンの存在感がすごいです。
アイコンだけでなく、メソッド名などもCop感が出ていて面白いライブラリです。

swiftCopExample

標準では以下のバリデーションに対応しているようです。

タイプ 内容
exclusion 含まれていない
format 書式
inclusion 含まれている
email メールアドレス
length 長さ
beTrue 真である
beFalse 偽である

後述しますが、独自にバリデーションを追加することが可能です。

使い方

まず、ViewDidLoadなどで TextFieldに対してaddSuspectしてsuspect(容疑者)を追加します。

    let swiftCop: SwiftCop = SwiftCop()

    override func viewDidLoad() {
        super.viewDidLoad()
        swiftCop.addSuspect(Suspect(view: emailTextField, sentence: "EmptyEMail".localized(table: "Validation"), trial: Trial.length(.minimum, 1)))
        swiftCop.addSuspect(Suspect(view: emailTextField, sentence: "InvalidEMail".localized(table: "Validation"), trial: Trial.email))
    }

そして、実際のバリデーションの処理では、isGuiltyでGuilty(罪)を問います。
バリデーションに引っかかると罪と判定され、verdict()でverdict(評決)が下されてバリデーションのメッセージが返却されます。
バリデーションが通った場合は「逮捕 -> 裁判 -> 不起訴」で保釈されますが、バリデーションが通らなかった場合は、「逮捕 -> 裁判 -> 起訴」で評決が下されるとイメージすればわかりやすいかもしれません。

    @IBAction func sendButtonTouchUpInside() {
        emailMessage.text = ""
        if let guilty = swiftCop.isGuilty(emailTextField) {
            emailMessage.text = guilty.verdict()
        } else {
  // バリデーションが通った場合の処理
        }
    }

独自のバリデーションを追加する

独自のバリデーションを追加する場合は、TrialProtocolを実装したenum を定義します。

import Foundation
import SwiftCop

public enum FooTrial: TrialProtocol {
  case Bar
  case Baz

  public func trial() -> ((evidence: String) -> Bool){
    switch self {
    case .Bar:
      return { (evidence: String) -> Bool in
        // bool値を返却
      }
    case .Baz:
      return { (evidence: String) -> Bool in
        // bool値を返却
      }
    default:
        return { (evidence: String) -> Bool in
            return false
        }
    }
  }
}

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。