LoginSignup
2
2

More than 5 years have passed since last update.

Swiftで軽量バリデーターを作ってみた

Last updated at Posted at 2016-08-26

追記:Swift3.0にバージョンアップしました。

今回突発的にバリデータを作りました。
ただ単に、作った内容を紹介するだけでなく
何故作ったのか?作る過程、
といった側面も含めてまとめてみました。

【キッカケ】

OSS活動や、登壇、執筆などパブリック活動しないと、エンジニアとしての個人ブランドが育たない。
そのままだと業界の中央や、面白そうな箇所に介入したくても難しくなる。
結局、古めかしいクローズな環境にしか身をおけず、時代遅れはまだしも、
歴史館においてある蝋人形のモブキャラになりかねないと思ったため。

【期間】

衝動的に作ったので、コアとなる部分は、半日かかってないかも。
どちらかと言えば、その後のテストとかプリセット作成、
ライブラリ公開に関わる作業の方が時間かかってる。

【なぜそれを作った】

丁度探してたのもあるけど、
エレベーターピッチじゃないけど、エレベーターに乗ってる間に、イメージ付いてしまったので
会社についてすぐに紙とペンで書いてたら、「あ、もういいや、これ作っちゃおう」と思ったから。

【どのように作った】

上にも書いたけど、衝動的だったので朝の20分から40分ぐらい。
紙とボールペン使って、構造や流れが大体把握できるまで走らせた。

その後、その日のオヤツ時間から夕食ぐらいまで紙からコードに憑依させた。
Ω<お前に生命を吹き込んでやる!! タカタカッッ…ターーッン!

その後に細かい拡張、バグ、テスト、公開に時間かけた。
Ω<お前に魂があるのなら…応えろ!! タカタカッッ…ターーッン!

【ライブラリ】

【なぜ英語】

勉強。構文とか単語とか間違ってるのは分かって書いてる。
ネイティヴの英会話の先生に

「私の話してる日本語に間違いが多くても、あなたたち日本人は、何が言いたいか推測できるでしょ?私たちも一緒。大体何伝えたいか分かっから怖がらず考えすぎず話しなさい」

って言われてから、頑張ってる。

【ライブラリ説明】

ポリシーはシンプルでお手軽。目的からブレない。目的はモデルの検証。

classのインスタンス変数に対して、コード上で制約を複数個つけれる。検証は必要になったタイミングで検証メソッドを対象インスタンス渡してコール。

結果は戻り値に帰ってきて、無効/有効判定と無効だったエラーメッセージが入ってる。

エラーメッセージは制約毎ではなく、インスタンス変数に紐付く制約毎に設定できる。(しないといけない)

【使い方】

検証したい Model に RNValidatable を実装する。

class ProfileEntity : RNValidatable {
    var firstName:String
    var lastName:String

    init(firstName:String, lastName:String){
        self.firstName = firstName
        self.lastName = lastName
    }

    func bindConstraint(binder: RNConstraintBinder) {
        binder.bind(firstName, accessTag: "firstName")
            .add(constraint:RNConstraintLength(max: 10, errorMessage: "Invalid range"))
            .add(constraint:RNConstraintAlphabet(errorMessage: "Only alphabets."))
        binder.bind(lastName, accessTag: "lastName")
            .add(constraint:RNConstraintLength(max: 10, errorMessage: "Invalid range"))
            .add(constraint:RNConstraintAlphabet(errorMessage: "Only alphabets."))
    }
}

RNValidatorの検証メソッドを呼んで、先ほどの Model を渡すと、結果が帰ってくる。

let results = RNValidator.sharedInstance.validate(model)
if results.isInvalid {
    if let firstNameErrorMessages = results.fields["firstName"] {
        firstNameMessageLabel.text = firstNameErrorMessages.messages.joined(separator:"\n")
    }
    if let lastNameErrorMessages = results.fields["lastName"] {
        lastNameMessageLabel.text = lastNameErrorMessages.messages.join(separator:"\n")
    }
}

よろしかったら使ってみてください。

いーーーじょぅ! :)

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