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
Introducing CodeLayout with Tips
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
satoshin21
March 28, 2018
Technology
1.7k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introducing CodeLayout with Tips
AKIBA.swift × エウレカ
satoshin21
March 28, 2018
More Decks by satoshin21
See All by satoshin21
少数精鋭で戦うための技術的改善について
satoshin21
3
1.5k
GTXiLibで小さく始めるAccessibility Testing
satoshin21
0
5.5k
iPhoneのカメラで写真撮影から現像までの技術を紐解く
satoshin21
5
3.8k
try! swift-sh
satoshin21
2
1k
Reduxを取り入れて開発はpairs開発はどう変わったか
satoshin21
0
410
レガシーなアプリケーションの 60fps化を目指す為にやっていること
satoshin21
12
4.2k
World of No Interface Builder
satoshin21
0
2.1k
What I've done to attend WWDC
satoshin21
0
160
Swift Package Manager V4でAlfred Workflowを作ろう
satoshin21
0
320
Other Decks in Technology
See All in Technology
AI時代におけるプロダクト横断勉強会の設計
zozotech
PRO
0
110
Kiro5兄弟のいまどきのセキュリティ基礎知識
kentapapa
0
500
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
210
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
220
Master Dataグループ紹介資料
sansan33
PRO
1
4.9k
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
18
17k
Does an AI Watermark Survive Translation?
machinetranslation
0
520
VPCでもFloatingIPを使いたいんだ
y_kotani
1
140
Oracle AI Databaseデータベース・サービス: BaseDB/ExaDB-Dの可用性
oracle4engineer
PRO
1
1.1k
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
290
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
1
810
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Music & Morning Musume
bryan
47
7.3k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
320
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Become a Pro
speakerdeck
PRO
31
6.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
560
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
320
Transcript
Copyright © 2017 eureka, Inc. All rights reserved. ίʔυϨΠΞτͷεεϝ Introducing
CodeLayout with Tips
Copyright © 2017 eureka, Inc. All rights reserved. 2 $
whoami !TBUPTIJO QBJST+1J04"QQMJDBUJPO&OHJOFFSBUFVSFLB *OD J04 "OESPJE "QQMF4DSJQU 5ZQF4DSJQUษڧத .BSWFM$JOFNBUJD6OJWFSTFେ͖
Copyright © 2017 eureka, Inc. All rights reserved. 3 Agenda
Ͳ͏ͯ͠*OUFSGBDF#VJMEFSΛΘͳ͍ܾஅΛͨ͠ͷ͔ ίʔυϨΠΞτͷਏ͍ॴ ίʔυϨΠΞτΛΩϨΠʹॻ͘ҝʹ
Copyright © 2017 eureka, Inc. All rights reserved. 4 Target
audience ݱࡏ*OUFSGBDF#VJMEFSΛ͍ͬͯͯɺਏ͞Λײ͍ͯ͡Δ TUPSZCPBSEͱYJCͷϨϏϡʔ͕ਏ͍ ͔͠͠ɺίʔυϨΠΞτίʔυྔ͕૿͑ͦ͏Ͱ͍᪳ͯ͠Δ
Copyright © 2017 eureka, Inc. All rights reserved. 5 pairs
Japan *OUFSGBDF#VJMEFS͍ͬͯ·ͤΜ "VUP-BZPVU͍ͬͯ·͢
Copyright © 2017 eureka, Inc. All rights reserved. 6 pairs
Global *OUFSGBDF#VJMEFS͍ͬͯ·ͤΜ 5FYUVSF :PHBͳͲ"VUP-BZPVUҎ֎ͷϨΠΞτΤϯδϯͱ"VUP-BZPVU ΛҰॹʹ͍ͬͯ·͢
Կނ Interface builderΛ Θͳ͍ͷ͔
Copyright © 2017 eureka, Inc. All rights reserved. 8 IBOutlet,
IBAction *NQMJDJUMZ6OXSBQQFE0QUJPOBM *#ͱίʔυͷඥ͚Εʹؾ͖ͮʹ͍͘ *OJUJBMJ[FSͰͷ6*ఆ͕ٛͰ͖ͳ͍ ΄ΜͱʹOJMͷϋϯυϦϯάͰ͖ͯΔʁ 3YͳͲʹΑΓΠϕϯτʹΑΓ6*ͷૢ࡞ൃੜ࣌ͳͲ
Copyright © 2017 eureka, Inc. All rights reserved. 9 Segue͕ਏ͍
QSFQBSF'PS4FHVFTFOEFSʹॳظԽͷॲཧΛ·ͱΊͳ͚ΕͳΒͳ͍ QFSGPSN4FHVFͷ*EFOUJpFS4USJOH ͭΒ͍
Copyright © 2017 eureka, Inc. All rights reserved. 10 Continuous
Developingʹ͔ͳ͍(ؾ͕͢Δ) ॳճߏங࣌&NQUZ7JFX͕͚ͭͩͩͬͨͩͬͨΒ*#্Ͱɾɾ &NQUZ7JFXͷछྨ͕Ճ͞Εͨ 4UPSZCPBSE্ͰՃ͢Δ ·ͨ&NQUZ7JFXͷछྨ͕Ճ͞Εͨ -
None
Copyright © 2017 eureka, Inc. All rights reserved. 12 Continuous
Developingʹ͔ͳ͍(ؾ͕͢Δ) 7JFX͕ॏͳΓ߹͏ࠈ ࠷ॳͷઃܭͷͩͬͨՄೳੑ͕ߴ͍͕ɺ*OUFSGBDF#VJMEFS্Ͱ੍Λ อͬͨ··ϨΠΞτ༷Λมߋ͢Δͷࠔ ಈతͳϨΠΞτมߋͩͱঘߋ
Copyright © 2017 eureka, Inc. All rights reserved. 13 try!
Swift After TalksͰͨ͜͠ͱ 6*7JFXͷBUUSJCVUFTͲ͜Ͱఆٛ͢Δͷ 4UPSZCPBSEYJCͷSFWJFXਏ͍Α
ίʔυϨΠΞτʹ Ҡߦͯ͠1 தʑ͏·͘Ε͍ͯΔ
ίʔυϨΠΞτͰ Կ͕มΘ͔ͬͨ
Copyright © 2017 eureka, Inc. All rights reserved. 16 ViewControllerͷ։ൃʹ੍ݶ͕ͳ͘ͳͬͨ
JOJUJBMJ[FSͰͷґଘੑೖ JOJUJBMJ[FSͷ׆༻ͷ෯͕͕ͬͨ (FOFSJDTΛ༻͍ͯ7JFX$POUSPMMFSΛ։ൃ ίʔυޙ΄Ͳ
Copyright © 2017 eureka, Inc. All rights reserved. 17 ܧଓత։ൃ͕͍͢͠
"#ςετ͕ͱʹ͔͍͘͢͠ 6*ύʔπͷࠩ͠ସ͑*#ʹൺͯ҆қ ঢ়ଶʹΑͬͯϨΠΞτ͕ΓସΘΔ༷ίʔυʹ͢Δ͜ͱͰ࣮ݱ͠ ͘͢ͳͬͨ
Copyright © 2017 eureka, Inc. All rights reserved. 18 ͦͷଞ
BUUSJCVUFTίʔυ্Ͱఆٛ͢ΔͷΈ SFWJFX4UPSZCPBSEYJC YNM ʹൺͯ֨ஈʹ͠қ͍ 3FWJFXFS DPOqJDUमਖ਼͕҆қʹ
Copyright © 2017 eureka, Inc. All rights reserved. 19 AutoLayout
ͨͩɺKQະͩ"VUP-BZPVUΛ͍ͬͯΔ ݱߦҠߦ͢Δʹ5FYUVSFͷֶशίετ͕ߴ͍ "VUP-BZPVUʹݶքΛײ͍ͯ͡ΔҝɺݱࡏҠߦΛݕ౼த ίʔυϨΠΞτʹ͓͔ͨ͛͠ͰɺϨΠΞτΤϯδϯͷҠߦ͠қ͍ ͣ
͔͠͠
ίʔυϨΠΞτʹ ͋Δఔͷਏ͕͋͞Δ
Copyright © 2017 eureka, Inc. All rights reserved. 22 ίʔυϨΠΞτͷਏ͞
ίʔυྔͷ૿େ "VUP-BZPVUͷ੍ఆٛ ίʔυϏϧυϨΠΞτ֬ೝίʔυͷαΠΫϧ ͳΜͱ͔͜ͷਏ͞Λܰݮ͍ͨ͠
Copyright © 2017 eureka, Inc. All rights reserved. 23 ίʔυྔͷ૿େ
ίʔυྔͷ૿େࣗମͦΕ΄ͲͰͳ͘ɺݟ௨͕͠ѱ͘ͳΔ͜ͱ͕ 4DPQFT 'BLF /BNFTQBDFT "UPNJD%FTJHO
Copyright © 2017 eureka, Inc. All rights reserved. Clean Code:
Scopes
Copyright © 2017 eureka, Inc. All rights reserved. 25 Scopes:
apply extension CustomDebugStringConvertible { @discardableResult func apply(_ closure: (Self) -> Void) -> Self { closure(self) return self } } self.titleLabel = UILabel(frame: .zero).apply({ $0.translatesAutoresizingMaskIntoConstraints = false $0.textColor = PairsPalette.gray01 $0.font = .boldSystemFont(ofSize: 15) $0.textAlignment = .center })
Copyright © 2017 eureka, Inc. All rights reserved. 26 Scopes:
apply extension CustomDebugStringConvertible { @discardableResult func apply(_ closure: (Self) -> Void) -> Self { closure(self) return self } } self.titleLabel = UILabel(frame: .zero).apply({ $0.translatesAutoresizingMaskIntoConstraints = false $0.textColor = .gray01 $0.font = .boldSystemFont(ofSize: 15) $0.textAlignment = .center })
Copyright © 2017 eureka, Inc. All rights reserved. 27 Scopes:
do constrain: do { constrain(view, backgroundView) { (view, backgroundView) in backgroundView.leading == view.leading backgroundView.trailing == view.trailing } } rxSetup: do { viewModel.didSomething .subscribe(onNext: { self.doSomething() }) .disposeWith(self) }
Copyright © 2017 eureka, Inc. All rights reserved. 28 Scopes:
do constrain: do { constrain(view, backgroundView) { (view, backgroundView) in backgroundView.leading == view.leading backgroundView.trailing == view.trailing } } rxSetup: do { viewModel.didSomething .subscribe(onNext: { self.doSomething() }) .disposeWith(self) }
Copyright © 2017 eureka, Inc. All rights reserved. 29 Scopes:
do constrain: do { constrain(view, backgroundView) { (view, backgroundView) in backgroundView.leading == view.leading backgroundView.trailing == view.trailing } } rxSetup: do { viewModel.didSomething .subscribe(onNext: { self.doSomething() }) .disposeWith(self) }
Copyright © 2017 eureka, Inc. All rights reserved. Clean Code:
Namespaces
Copyright © 2017 eureka, Inc. All rights reserved. 31 Namespaces
7JFXͷυϝΠϯΛҙࣝͤ͞Δ υϝΠϯຖʹ໊લۭؒΛ࡞ͬͯ۠ΓɺείʔϓΛ࡞Δ
Copyright © 2017 eureka, Inc. All rights reserved. 32 Namespaces
֤4DFOFʹఆٛ͢Δ7JFXΛٖࣅత/BNFTQBDFΛ࡞ͬͯάϧʔϐϯά͢Δ enum Card { enum SceneName {} enum Scene2Name {} }
Copyright © 2017 eureka, Inc. All rights reserved. 33 Namespaces
extension Card.SceneName { final class Overlay: UIView { override init(frame: CGRect) { super.init(frame: frame) // ... } @available(*, unavailable) required init?(coder aDecoder: NSCoder) { fatalError() } } } let overlayView = Card.SceneName.Overlay(frame: .zero) addSubview(overlayView)
Copyright © 2017 eureka, Inc. All rights reserved. 34 Namespaces
extension Card.SceneName { final class Overlay: UIView { override init(frame: CGRect) { super.init(frame: frame) // ... } @available(*, unavailable) required init?(coder aDecoder: NSCoder) { fatalError() } } } let overlayView = Card.SceneName.Overlay(frame: .zero) addSubview(overlayView)
Copyright © 2017 eureka, Inc. All rights reserved. Atomic Design
Copyright © 2017 eureka, Inc. All rights reserved. 36 Atomic
Design "UPNJD%FTJHOΛ ͋Δఔ ҙࣝͯ͠7JFXύʔπΛ࡞͢Δ 7JFXͷ࠶ར༻ੑΛߴΊΔ
Copyright © 2017 eureka, Inc. All rights reserved. 37 Atomic
Design "UPNT .PMFDVMFT 0SHBOJTNT 5FNQMBUFT 1BHFT
Copyright © 2017 eureka, Inc. All rights reserved. 38 Atomic
Design "UPNT .PMFDVMFT 0SHBOJTNT 5FNQMBUFT 1BHFT "UPNTϨϕϧͰ࡞͍ͬͯΔͱͭΒΈ͕ଟ͍ͷͰɺ.PMFTDVMFTϨϕϧͰ7JFX Λఆٛ͢Δ ͱ͍͑ɺ6*ύʔπͷׂσβΠφʔɺٴͼ4LFUDIϑΝΠϧͱরΒ͠߹ Θͤͳ͕Β֬ೝ͖͢
Copyright © 2017 eureka, Inc. All rights reserved. 39 Atomic
Design: Generics as Templates .PMFDVMFT 0SHBOJTNTΛ6*7JFXͰ࡞Δ 5FNQMBUFTΛ6*7JFX$POUSPMMFSͱ(FOFSJDTͰఆٛ͢Δ ґଘੑΛೖͯ͠1BHFTΛ࡞Δ
Copyright © 2017 eureka, Inc. All rights reserved. 40 Atomic
Design: Generics as Templates final class CardsViewController<ViewModel: CardViewModel, DataSource: CardDataSource>: UIViewController { private let viewModel: ViewModel private let dataSource: DataSource init(viewModel: ViewModel, dataSource: DataSource) { self.viewModel = viewModel self.dataSource = dataSource super.init(nibName: nil, bundle: nil) } @available(*, unavailable) required init?(coder aDecoder: NSCoder) { fatalError() } }
Copyright © 2017 eureka, Inc. All rights reserved. 41 Atomic
Design: Generics as Templates final class CardsViewController<ViewModel: CardViewModel, DataSource: CardDataSource>: UIViewController { private let viewModel: ViewModel private let dataSource: DataSource init(viewModel: ViewModel, dataSource: DataSource) { self.viewModel = viewModel self.dataSource = dataSource super.init(nibName: nil, bundle: nil) } @available(*, unavailable) required init?(coder aDecoder: NSCoder) { fatalError() } }
Copyright © 2017 eureka, Inc. All rights reserved. 42 Atomic
Design: Generics as Templates let viewModel = UserCardType.Pickup() let dataSource = PickupCardDataSource(viewModel: viewModel) let cardViewController = CardsViewController(viewModel: viewModel, dataSource: dataSource)
Copyright © 2017 eureka, Inc. All rights reserved. AutoLayoutͷ੍
Copyright © 2017 eureka, Inc. All rights reserved. 44 AutoLayout:
Cartography SPCC$BSUPHSBQIZͰ"VUP-BZPVU Λఆٛ͢Δ "VUP-BZPVUͷఆٛͷείʔϓΛڧ ੍తʹڱΊΒΕΔ $POUFOUIVHHJOHQSJPSJUZ7JFX ͷଐੑͱͯ͠ѻ͍ɺBQQMZͰఆٛ ͢Δ
Copyright © 2017 eureka, Inc. All rights reserved. ࣮αΠΫϧ
Copyright © 2017 eureka, Inc. All rights reserved. 46 ࣮αΠΫϧ
2ʮίʔυϨΠΞτͩͱ࣮ࡍͷϨΠΞτΛίʔυ͔Β૾͠ʹ͍͘ͷ Ͱͳ͍͔ʯ "͔֬ʹجຊతʹϏϧυͯ֬͠ೝ͢Δ
Copyright © 2017 eureka, Inc. All rights reserved. 47 ࣮αΠΫϧ
QBJSTͷಛੑ্ɺ6TFS4UBUVTʹԠͯ͡ಈతʹΓସΘΔը໘͕ଟ͍ ͦͦ*#্ͷ੩తͳଥੑݕূ͕͠ਏ͍ঢ়ଶ ͦΕͰίʔυϏϧυϨΠΞτ֬ೝίʔυͷαΠΫϧݮΒ͠ ͯ։ൃΛߴԽ͍ͨ͠ ϥϯλΠϜͰϨΠΞτΛௐͭͭ֬͠ೝ͢Ε͍͍͡ΌΜ͔
Copyright © 2017 eureka, Inc. All rights reserved. 48 ࣮αΠΫϧ
3FWFBM ϥϯλΠϜ7JFXσόοάπʔϧ 7JFXͷBUUSJCVUFTDPOTUSBJOUTΛϥϯ λΠϜ্Ͱมߋ ݟͨΛϦΞϧλΠϜͰม͑ͳ͕Β࣮ αΠΫϧΛ࠷খݶʹ͢Δ %&.0͠·͢
Copyright © 2017 eureka, Inc. All rights reserved. 49 ·ͱΊ
ӡ༻εςʔδʹೖΔͱɺ*OUFSGBDF#VJMEFSਏ͔ͬͨ ίʔυϨΠΞτʹҠߦ͢Δ͜ͱͰɺมԽʹڧ͘ͳΔ ʮมԽʹ࠷ରԠͰ͖Δੜ͖͕ੜ͖Δʯ ίʔυϨΠΞτͷπϥϛɺͰݮͰ͖Δ
Ϣʔβʹͱͬͯ ΤϯδχΞʹͱͬͯ շదͳϓϩμΫτΛ
Thank you IUUQTXXXOBTBHPWNJTTJPO@QBHFT/11OFXTFBSUIBUOJHIUIUNM