LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

13
LLプログラマ向けExtensionsテストライブラリ Quickの紹介 2Swi2 勉強会 in TechBuzz KitchHike, Inc. 藤崎祥見 2014/07/18

description

第2回Swift勉強会 in TechBuzz http://atnd.org/events/51944 で発表した資料です。 ExSwift, Pythonic.Swift, Dollar.swift, __.swiftとSpecライクにテストが書けるQuickの紹介です。

Transcript of LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

Page 1: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

LLプログラマ向けExtensionsと  テストライブラリ  Quickの紹介

第2回  Swi2  勉強会  in  TechBuzz    

KitchHike,  Inc.  藤崎祥見  2014/07/18

Page 2: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

自己紹介

•  藤崎祥見(フジサキ ショウケン)  •  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日の開発合宿で麻雀の捨て牌候補を表示す

るアプリ作成

Page 3: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

What is KitchHike

現地人とコミュニケーションを取りたい旅行者が、 料理を作ってくれる現地人の家に 遊びにいけるサービスです。

hQps://kitchhike.com/

Page 4: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

LLプログラマが幸せになれるそうな  Swi2  Extensionsの紹介

•  Extensionsとは  •  ExSwi2  •  Pythonic.swi2  •  Dollar.swi2  と  __.swi2  •  RubySwi2  •  おまけ:  テストフレームワークQuick  

Page 5: LLプログラマ向けSwift Extensionsとテストライブラリ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

Page 6: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

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  サンプルコード

Page 7: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

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  サンプルコード

Page 8: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

•  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

Page 9: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

$.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  サンプルコード

Page 10: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

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  サンプルコード

Page 11: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

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  サンプルコード

Page 12: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

まとめとTIPS •  プロジェクトにファイルを置くだけ手軽に導入できる  •  Ruby使っている人にはQuickおすすめ  

o  Spec!  Spec!  

•  プロジェクトで導入するには、バージョンを固定するのが吉  o  仕様変更もたびたびあるので下手にUpdateすると動かなくなる  

•  必要な部分だけつまんで導入するのもあり  o  リポジトリのソースを参考に自分で書くのもあり  

•  他のExtensionsとのコンフリクトに注意!  o  Arrayクラスはだいたい拡張されている

Page 13: LLプログラマ向けSwift ExtensionsとテストライブラリQuickの紹介

https://kitchhike.com/