llプログラマ向けswift extensionsとテストライブラリquickの紹介
DESCRIPTION
第2回Swift勉強会 in TechBuzz http://atnd.org/events/51944 で発表した資料です。 ExSwift, Pythonic.Swift, Dollar.swift, __.swiftとSpecライクにテストが書けるQuickの紹介です。TRANSCRIPT
LLプログラマ向けExtensionsと テストライブラリ Quickの紹介
第2回 Swi2 勉強会 in TechBuzz
KitchHike, Inc. 藤崎祥見 2014/07/18
自己紹介
• 藤崎祥見(フジサキ ショウケン) • KitchHike, Inc. 代表取締役 Co-‐CEO • 普段はRuby on Railsで開発しています。 • MongoDB JP 副代表
gihyo.jpで「MongoDBでゆるふわDB体験」を連載 • TwiQer: @syokenz, Qiita: syokenz • www.facebook.com/fujisaki.shoken • Swi2経験: 2泊3日の開発合宿で麻雀の捨て牌候補を表示す
るアプリ作成
What is KitchHike
現地人とコミュニケーションを取りたい旅行者が、 料理を作ってくれる現地人の家に 遊びにいけるサービスです。
hQps://kitchhike.com/
LLプログラマが幸せになれるそうな Swi2 Extensionsの紹介
• Extensionsとは • ExSwi2 • Pythonic.swi2 • Dollar.swi2 と __.swi2 • RubySwi2 • おまけ: テストフレームワークQuick
Extensionsとは • Swi2の標準クラスを拡張できる仕組み • ObjecYve-‐Cでは拡張カテゴリと呼ばれていたもの
extension Array { ! func each(f: (Element) -> ()) { ! for e in self { ! f(e) ! } ! } !} !!
Extensions サンプルコード: Arrayにeachを実装する
> [1,2,3].each { println($0) } !=> 1 !=> 2 !=> 3
ExSwi2 • hQps://github.com/pNre/ExSwi2 • JavaScript (Lo-‐Dash, Underscore) & Rubyにインスパイア • Swi2クラス拡張タイプ • ファーストコミット 2014/06/04(WWDCの次の日) • 仕事早すぎぃ!
356
let array = [5, 1, 0, 10] !array.each { item in println(item) } !!var items = Int[]() !(0..2).each { items.append($0) } !!let dic = ["A": 1, "B": 2, "C": 3] !dic.each { key, value in println(key, value) } !dic.has(“A”) !!let dic = [ "A": 1, "B": 2, "C": 3 ] !let mapped = dic.map(mapFunction: { return ($0 + "!", $1 + 1) }) !println(mapped)
ExSwi2 サンプルコード
Pythonic.Swi2 • hQps://github.com/pracYcalswi2/Pythonic.swi2 • Python • Swi2クラス拡張タイプ • タブとは何だったのか?
227
if re.search("^foo", "foobar") { ! println(["foo", "bar", "zonk"].index("foo")) // 0 ! println(["foo", "bar", "zonk"].count("bar")) // 1 ! println(["foo", "bar", "zonk"].count("zoo")) // 0 !} !!if any(["foo", "bar", "zonk"]) { ! println(chr(ord("a"))) // a !} !!var greeting = " hello pythonista " !if greeting.strip().startswith("hello") { ! println(greeting.strip().title()) // Hello Pythonista!}
Pyhonic.Swi2 サンプルコード
• hQps://github.com/ankurp/Dollar.swi2 • Lo-‐Dash or Underscoreにインスパイア • 独自クラス(なので厳密にはExtensionsでは無い) • 同じプロジェクト内にCentというSwi2拡張タイプもある • みんなの$が大好き
• hQps://github.com/lotz84/__.swi2 • Underscore.jsのクローン • 独自クラス(なので厳密にはExtensionsでは無い) • _(アンダースコア)は2つ
__.swi2 55
1,022 Dollar.swi2
$.at(["ant", "bat", "cat", "dog", "egg"], indexes: 0, 2, 4) !=> ["ant", "cat", "egg”] !!$.contains([1, 2, 3, 1, 2, 3], value: 2) !=> True !
$.range(0, endVal: 20, incrementBy: 5) !=> [0, 5, 10, 15] !!let fun = $.bind({ (names: String...) -> String in ! let people = $.join(names, separator: " from ") ! return "Hello \(people)" ! }, "Ankur", "Swift") !$.times(2, function: fun) as String[] !=> ["Hello Ankur from Swift", "Hello Ankur from Swift"] !
Dollar.Swi2 サンプルコード
RubySwi2 • hQps://github.com/Appletone/RubySwi2 • Ruby • ファーストコミット 2014/07/16 メソッド少なすぎぃ! • とりあえずStarした
1
5.times { ! println("Hey! You look really like Ruby") !} !!5.upto(10) { ! println($0) !} !!"HELLO".capitalized() !=> Hello
RubySwi2 サンプルコード
Quick • hQps://github.com/Quick/Quick • Specライクなテストフレームワーク • 実際に使った。幸せになれた。ドキュメントも充実している。
705
import Quick !import Nimble !!class DolphinSpec: QuickSpec { ! override func spec() { ! it("is friendly") { ! expect(Dolphin().isFriendly).to.beTrue() ! } !! it("is smart") { ! expect(Dolphin().isSmart).to.beTrue() ! } ! } !}
Quick サンプルコード
まとめとTIPS • プロジェクトにファイルを置くだけ手軽に導入できる • Ruby使っている人にはQuickおすすめ
o Spec! Spec!
• プロジェクトで導入するには、バージョンを固定するのが吉 o 仕様変更もたびたびあるので下手にUpdateすると動かなくなる
• 必要な部分だけつまんで導入するのもあり o リポジトリのソースを参考に自分で書くのもあり
• 他のExtensionsとのコンフリクトに注意! o Arrayクラスはだいたい拡張されている
https://kitchhike.com/