Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Introducing CodeLayout with Tips
Search
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.9k
try! swift-sh
satoshin21
2
1.1k
Reduxを取り入れて開発はpairs開発はどう変わったか
satoshin21
0
420
レガシーなアプリケーションの 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
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
2
510
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
360
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
あるけみー式LTスライド作成術
alchemy1115
2
220
2026_devsumi_ozono.pdf
o3
3
520
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
340
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
120
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2.1k
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.2k
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
210
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
2
580
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
110
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
530
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
540
WCS-LA-2024
lcolladotor
0
830
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
So, you think you're a good person
axbom
PRO
2
2.2k
Scaling GitHub
holman
464
140k
Bash Introduction
62gerente
615
220k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
420
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Become a Pro
speakerdeck
PRO
31
6.3k
Raft: Consensus for Rubyists
vanstee
142
7.7k
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