oss written in swift

Post on 22-Jan-2018

1.255 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

OSS written in Swift

yukiasai

・浅井勇樹 28歳

・Github : yukiasai

・出身:福井県福井高専

・今 : 株式会社マネーフォワード

・マネーフォワード -自動家計簿アプリ

・過去 : 株式会社ナチュラルスタイル

・ZOZOTOWN -ファッション通販アプリ

・WEAR -ファッションコーディネートアプリ

・得意 : iOS

・趣味 : ディズニーランド

自己紹介

日常のコードリーディング

・Trending repositories - Github

・最近人気のリポジトリランキング

・Search Github - Github

・使い方がわからないクラスがあったらとりあえず検索

・みんながどんな使い方をしているかわかる

社内でコードリーディング

・週1でSwiftコードリーディング会を開催

・全社のiOSエンジニアに知見を共有するのが目的

・有名どころから自作まで様々

・Alamofire

・Bond

・ObjectMapper

・SwiftTask

・などなど、、、

最近までOSSをリリースしようとは思わなかった

弊社技術顧問の松田明さんに言われたこと

「コミュニティに還元しよう」

「ただ乗りイクナイ」

紹介するOSS

・Shoyu - yukiasai/Shoyu

・UITableViewをもっと簡単に

・Gecco - yukiasai/Gecco

・ビューにスポットライトをあてたい

・Kaiseki - yukiasai/Kaiseki

・JSONのパースを自動で

すみません半分iOS系です

Shoyu

UITableViewをもっと簡単に

UITableViewを普通に使うとこうなる

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

return 3

}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

switch section {

case 0: return 5

case 1: return 3

default: fatalError()

}

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->

UITableViewCell {

switch (indexPath.section, indexPath.row) {

case (0, _):

let cell = tableView.dequeueReusableCellWithIdentifier("MemberCell") as! MemberTableViewCell

return cell

case (1, _):

let cell = tableView.dequeueReusableCellWithIdentifier("GroupCell") as! GroupTableViewCell

return cell

default:

fatalError()

}

}

UITableViewあるある

・デリゲートメソッドがswitch文(if文)地獄になる

・ビューの見た目とコードの見た目が乖離している

・どのセクションにどのローが表示されているか追うのが大変

・switch文を一箇所いじるとほぼ全箇所に影響する

・バグの温床となる可能性が極めて高い

・カスタムセルを使う場合デリゲートメソッド内でいちいちキャストしてやる必要がある

Shoyuだとこうなる

tableView.source = Source()

.createSection { section in

section.createRows(5) { (_, row: Row<MemberTableViewCell>) in

row.height = 52

row.configureCell = { cell, _ in }

row.didSelect = { _ in }

}

}

.createSection { section in

section.createRows(3) { (_, row: Row<GroupTableViewCell>) in

row.height = 52

row.configureCell = { cell, _ in }

row.didSelect = { _ in }

}

}

tableView.reloadData()

Shoyuの利点

・switch文(if文)地獄から開放される

・ビューの見た目とコードの見た目が近い

・セクションの追加、ローの追加がとっても楽ちん

Gecco

ビューにスポットライトをあてたい

・こんなのできないの?とよく聞かれる

・円、長方形、角丸長方形をサポート

・ModalViewControllerで表示

・そうじゃなくてもいい

Kaisekiで使われているテクニック

Kaiseki

JSONのパースを自動で

Kaisekiを使うとこうなる

こんなオブジェクトを宣言

class Object: Entity {

// Basic

let int = Property<Int>()

let string = Property<String>()

// Array

let array = Property<[Bool]>()

// Optional

let optional = Property<Int?>()

// Entity

let object = Property<Object?>()

}

使い方let json: [String: AnyObject] = [“int”: 1, “string”: “aaa”, “array”: [true, false], “optional”: null, ....]

let obj = Object.fromJSON(json: jsonData)

obj.int.value // -> 1

obj.string.value // -> aaa

Kaisekiで使われているテクニック

・Mirrorを用いた自動マッピング

・プロトコルで構造体(Int,Optional,Array)を拡張

Thank you!

yukiasai

top related