SelectorKitというライブラリを公開します

http://soutaro.github.com/SelectorKit

iOSアプリのViewを指定するためのselectorです。割とCSSセレクタに似た構文にしています。uiQueryというのがあるのですが、これを書くのがかなりしんどいのでかっとなって作りました。

ドキュメントに書いてないのですが、新機能としてセレクタの途中の要素を選択することができます。{}でくくります。CSSにもない新機能!多分バギーです。非決定的な要素を選択する場合にうまく動作しないと思う。*1

例。

  • 「コーヒー」と書かれたラベルを含むテーブルビューセル
    • { UITableViewCell } UILabel:[text='コーヒー']
  • menu-item-listというaccessibilityIdentifierをもつUITable
    • UITable#menu-item-list
  • 前方一致、後方一致
    • UILabel[text ^= Hello]
    • UILabel[text $= "こんにちは世界!"]
  • UITableViewCellのサブクラスではなく、厳密にマッチするやつ
  • UIButton:nth-index(1)

最初はサブクラスを特別扱いして「

今後の課題

  • エラー処理
  • 速度がちょっと遅いかもしれない(普通に使えるけどね)
  • 疑似クラスの追加
    • nth-from-topとかnth-from-leftとか、UIView#subviewの順序じゃなくて、位置でo順序を指定するオペレータが欲しいと思う
  • CSSセレクタの>とか、~とか+とかみたいなやつとか
    • いらないかなーと思って実装が面倒だったので省略したんだけど、あったほうが良い気がしてきた。
    • 「コーヒー」と「\350」が両方含まれているテーブルビューセルがとってきたい!みたいな場合に。

手を抜いたところ

パーサの話な。

文字列リテラル"hoge"の中の"をエスケープするのとかめんどかったので、""と''の両方が使えるようにしました。多分この戦略でいくと、両方いけるように連続した二つの文字列リテラルは連結するとかしないといけないと思う。

なんか実装しようと考えていたけど結局しなかったやつの名残とかがある。

*1:「{*} *」とあったときに、leafでないビューを全部とってくるのが正しい動作のような気がしますが、たぶんそうはなってないと思う。