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.4k
iPhoneのカメラで写真撮影から現像までの技術を紐解く
satoshin21
4
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
2k
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
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
150
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
130
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.1k
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
200個のGitHubリポジトリを横断調査したかった
icck
0
130
非エンジニアがClaudeと挑んだ「1ヶ月間プロダクト30本ノック」
askokc
0
580
AIのReact習熟度を測る
uhyo
2
600
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
150
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
6
2.4k
AIエージェントが名古屋の猛暑からあなたを守る
happysamurai294
0
130
連合学習と機密コンピューティング
lycorptech_jp
PRO
0
120
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.1k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Design in an AI World
tapps
1
240
Prompt Engineering for Job Search
mfonobong
0
340
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
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