Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Farewell SnapKit
Search
kameike
July 26, 2018
Programming
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Farewell SnapKit
ありがとう!!!!さようなら!(?)
kameike
July 26, 2018
More Decks by kameike
See All by kameike
LeanScrum
kameike
3
1.3k
橋の下で安心して寝るための 『iOSアプリ設計パターン入門』
kameike
0
2.2k
サポートを求めてAppleに電話するまでの道のり
kameike
4
2.3k
header-comment
kameike
5
1.5k
Other Decks in Programming
See All in Programming
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
220
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
数百円から始めるRuby電子工作
tarosay
0
130
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
520
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
Android CLI
fornewid
0
210
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
580
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.7k
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
230
Featured
See All Featured
Technical Leadership for Architectural Decision Making
baasie
3
460
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
440
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Scaling GitHub
holman
464
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
Practical Orchestrator
shlominoach
191
12k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Darren the Foodie - Storyboard
khoart
PRO
3
3.5k
Optimizing for Happiness
mojombo
378
71k
Transcript
Farewell SnapKit さようなら、ありがとうSnapkit! pixiv Inc. kameike 亀田 彗 2018.6.5
- パルシィというアプリを書いているもの です - 10月に福岡から上京 2 だれ @kameike
宣伝
• SnapKitよりもAnchorがDXが良いと思うよという話 • 最近わりと pod SnapKitを見かけたので... • 13,000スターのスーパースター。ありがとうの気持ち、大切! 4 今日の話の要約
5 前提
6 AutoLayout(viewに制約を追加するやつ) をコードで作りたい!
let constraints = NSLayoutConstraint( item: subview, attribute: .left, relatedBy: .equal,
toItem: view, attribute: .left, multiplier: 1.0, constant: 0.0) 普通に作る 10
let constraints = NSLayoutConstraint.constraints( withVisualFormat: "H:|-15-[view]-15-|", metrics: nil, views: ["view":
subView]) 例のアレ(VisualFormatLanguage) 10
10
10
// SnapKit subview.snp.makeConstraints { constraintMaker in constraintMaker.top.equalTo(view) constraintMaker.bottom.equalTo(view) constraintMaker.left.equalTo(view) constraintMaker.right.equalTo(view)
} SnapKit 10
// Anchor NSLayoutConstraint.activate([ subview.topAnchor.constraint(equalTo: view.topAnchor), subview.bottomAnchor.constraint(equalTo: view.bottomAnchor), subview.trailingAnchor.constraint(equalTo: view.trailingAnchor), subview.leadingAnchor.constraint(equalTo:
view.leadingAnchor) ]) Anchor(iOS9~) 10
13 書き方こそ似ているけども、 Anchorの方がDXが良いぞ〜! (あとUIKitだし...寿命も長いはず...)
14 Anchorのよさ
// SnapKit subview.snp.makeConstraints { constraintMaker in constraintMaker.top.equalTo(_ other: ConstraintRelatableTarget) }
// ConstraintRelatableTargetとして使える型 // Int UInt Float Double CGFloat CGSize CGPoint // UIEdgeInsets, UIView SnapKit 10
16 暗黙的...
SnapKit 10
// Anchor subview.topAnchor.constraint(_ equalTo: NSLayoutAnchor<NSLayoutYAxisAnchor>) Anchor 10
Anchor 10
20 よさ2 ありえない組み合わせが 型によって排除されている
// SnapKit subview.top.equalTo(superView.snp.right) このようなコード 10
期待される挙動 10
23 実行時エラー:sob:
// Anchor view.topAnchor.constraint(equalTo: superView.leadingAnchor) Anchorだと...! 10
// Anchor view.topAnchor.constraint(equalTo: superView.leadingAnchor) このようなコード 10 NSLayoutXAxisAnchor
26 コンパイルエラーになる:joy:
// SnapKit subview.top.bottom.equalTo(view).offset(10).offset(20) ちなみにSnapKitはこんなコードを コンパイルできてしまう 10
28 Anchor便利...!
29 SnapKit->Anchorで 移行Tips
30 基本的にはすんなり行くはず!
// SnapKit let offset = UIEdgeInsets(top: 10, left: 10, bottom:
10, right: 10) make.edges.equalTo(view).offset(offset) Edgeがほしい! 10
extension UIView { func edges(equalTo view: UIView, offset: UIEdgeInsets =
UIEdgeInsets()) { NSLayoutConstraint.activate([ topAnchor.constraint(equalTo: view.topAnchor, constant: offset.top), bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -offset.bottom), leftAnchor.constraint(equalTo: view.leftAnchor, constant: offset.left), rightAnchor.constraint(equalTo: view.rightAnchor, constant: -offset.right) ]) } } extensionでなんとかなる!10行ぐらい! 10
// SnapKit view.edges.equalTo(view).offset(UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
// Anchor+Extension view.edges(equalTo: view, offset: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)) なんとかなった...! 10
// leading, trailing extension UIView { func edges(equalTo view: UIView,
offset: NSDirectionalEdgeInset) { NSLayoutConstraint.activate([ topAnchor.constraint(equalTo: view.topAnchor, constant: offset.top), bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -offset.bottom), leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: offset.leadingAnchor), trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -offset.trailingAnchor) ]) } } 余談 leading trailingを使いたいなら 10
let offset = 3 * 5 // SnapKit だと大丈夫だけど make.top.equalTo(view).offset(offset)
// Anchor だとコンパイルエラー subview.topAnchor.constraint(equalTo: view.topAnchor, constant: offset) ConstraintXXXTarget的なものを CGFloatにする必要がある 10
36 余談の余談
@available(iOS 6.0, *) open func addConstraint(_ constraint: NSLayoutConstraint) // This
method will be deprecated in a future release and should be avoided. // Instead, set NSLayoutConstraint's active property to YES. 10 addConstraintは 使わない方がいい
let constraint = view.bottomAnchor.constraint(equalTo: bottomAnchor) constraint.isActive = true // もしくは
NSLayoutConstraint.activate([constraint]) // でconstraintを有効に...! こういう感じで 10
39 SnapKit余談
• 7/17にSwift4対応!(そろそろ保守されなくなってきてるって言おうとおもっていたのに) • ので、まだ慌てる時間じゃない...!? 40 まだしっかり保守されている...!
• 3000行の本体コード(RxCocoaの1/3ぐらいコードがある...!) • 大体全ての型にMapperを書いてDSL上では独自型だけで表現できる世界を実現してい る(その分よしなであり、上述の問題もあり ...) 41 整ったコード(整いすぎでは...?!)
42 Priorityに若干のカスタマイズ public static var medium: ConstraintPriority { #if os(OSX)
return 501.0 #else return 500.0 #endif }
• 時々example作ったからマージしてよ!という PRがきていた • 苦労をかんじる最適化 43 13000スターつくと何が起こるか
• SnapKit→Anchor • ありがとうSnapKit!さようなら!(?) 44 まとめ