Slide 1

Slide 1 text

Copyright © 2017 eureka, Inc. All rights reserved. ίʔυϨΠΞ΢τͷεεϝ Introducing CodeLayout with Tips

Slide 2

Slide 2 text

Copyright © 2017 eureka, Inc. All rights reserved. 2 $ whoami  !TBUPTIJO  QBJST+1J04"QQMJDBUJPO&OHJOFFSBUFVSFLB *OD  J04 "OESPJE "QQMF4DSJQU 5ZQF4DSJQUษڧத   .BSWFM$JOFNBUJD6OJWFSTFେ޷͖

Slide 3

Slide 3 text

Copyright © 2017 eureka, Inc. All rights reserved. 3 Agenda  Ͳ͏ͯ͠*OUFSGBDF#VJMEFSΛ࢖Θͳ͍ܾஅΛͨ͠ͷ͔  ίʔυϨΠΞ΢τͷਏ͍ॴ  ίʔυϨΠΞ΢τΛΩϨΠʹॻ͘ҝʹ

Slide 4

Slide 4 text

Copyright © 2017 eureka, Inc. All rights reserved. 4 Target audience  ݱࡏ*OUFSGBDF#VJMEFSΛ࢖͍ͬͯͯɺਏ͞Λײ͍ͯ͡Δ  TUPSZCPBSEͱYJCͷϨϏϡʔ͕ਏ͍  ͔͠͠ɺίʔυϨΠΞ΢τ͸ίʔυྔ͕૿͑ͦ͏Ͱ᪳᪯͍ͯ͠Δ

Slide 5

Slide 5 text

Copyright © 2017 eureka, Inc. All rights reserved. 5 pairs Japan  *OUFSGBDF#VJMEFS࢖͍ͬͯ·ͤΜ  "VUP-BZPVU͸࢖͍ͬͯ·͢

Slide 6

Slide 6 text

Copyright © 2017 eureka, Inc. All rights reserved. 6 pairs Global  *OUFSGBDF#VJMEFS࢖͍ͬͯ·ͤΜ  5FYUVSF :PHBͳͲ"VUP-BZPVUҎ֎ͷϨΠΞ΢τΤϯδϯͱ"VUP-BZPVU ΛҰॹʹ࢖͍ͬͯ·͢

Slide 7

Slide 7 text

Կނ Interface builderΛ ࢖Θͳ͍ͷ͔

Slide 8

Slide 8 text

Copyright © 2017 eureka, Inc. All rights reserved. 8 IBOutlet, IBAction  *NQMJDJUMZ6OXSBQQFE0QUJPOBM  *#ͱίʔυͷඥ෇͚๨Εʹؾ͖ͮʹ͍͘  *OJUJBMJ[FSͰͷ6*ఆ͕ٛͰ͖ͳ͍  ΄ΜͱʹOJMͷϋϯυϦϯάͰ͖ͯΔʁ  3YͳͲʹΑΓΠϕϯτʹΑΓ6*ͷૢ࡞ൃੜ࣌ͳͲ

Slide 9

Slide 9 text

Copyright © 2017 eureka, Inc. All rights reserved. 9 Segue͕ਏ͍  QSFQBSF'PS4FHVFTFOEFSʹॳظԽͷॲཧΛ·ͱΊͳ͚Ε͹ͳΒͳ͍  QFSGPSN4FHVFͷ*EFOUJpFS͸4USJOH  ͭΒ͍

Slide 10

Slide 10 text

Copyright © 2017 eureka, Inc. All rights reserved. 10 Continuous Developingʹ޲͔ͳ͍(ؾ͕͢Δ)  ॳճߏங࣌͸&NQUZ7JFX͕͚ͭͩͩͬͨͩͬͨΒ*#্Ͱɾɾ  &NQUZ7JFXͷछྨ͕௥Ճ͞Εͨ  4UPSZCPBSE্Ͱ௥Ճ͢Δ  ·ͨ&NQUZ7JFXͷछྨ͕௥Ճ͞Εͨ -

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Copyright © 2017 eureka, Inc. All rights reserved. 12 Continuous Developingʹ޲͔ͳ͍(ؾ͕͢Δ)  7JFX͕ॏͳΓ߹͏஍ࠈ  ࠷ॳͷઃܭͷ໰୊ͩͬͨՄೳੑ͕ߴ͍͕ɺ*OUFSGBDF#VJMEFS্Ͱ੍໿Λ อͬͨ··ϨΠΞ΢τ࢓༷Λมߋ͢Δͷ͸ࠔ೉  ಈతͳϨΠΞ΢τมߋͩͱঘߋ

Slide 13

Slide 13 text

Copyright © 2017 eureka, Inc. All rights reserved. 13 try! Swift After TalksͰ࿩ͨ͜͠ͱ  6*7JFXͷBUUSJCVUFTͲ͜Ͱఆٛ͢Δͷ໰୊  4UPSZCPBSEYJCͷSFWJFXਏ͍Α໰୊

Slide 14

Slide 14 text

ίʔυϨΠΞ΢τʹ Ҡߦͯ͠1೥ தʑ͏·͘΍Ε͍ͯΔ

Slide 15

Slide 15 text

ίʔυϨΠΞ΢τͰ Կ͕มΘ͔ͬͨ

Slide 16

Slide 16 text

Copyright © 2017 eureka, Inc. All rights reserved. 16 ViewControllerͷ։ൃʹ੍ݶ͕ͳ͘ͳͬͨ  JOJUJBMJ[FSͰͷґଘੑ஫ೖ  JOJUJBMJ[FSͷ׆༻ͷ෯͕޿͕ͬͨ  (FOFSJDTΛ༻͍ͯ7JFX$POUSPMMFSΛ։ൃ  ίʔυ͸ޙ΄Ͳ

Slide 17

Slide 17 text

Copyright © 2017 eureka, Inc. All rights reserved. 17 ܧଓత։ൃ͕͠΍͍͢  "#ςετ͕ͱʹ͔͘͠΍͍͢  6*ύʔπͷࠩ͠ସ͑΋*#ʹൺ΂ͯ҆қ  ঢ়ଶʹΑͬͯϨΠΞ΢τ͕੾ΓସΘΔ࢓༷͸ίʔυʹ͢Δ͜ͱͰ࣮ݱ͠΍ ͘͢ͳͬͨ

Slide 18

Slide 18 text

Copyright © 2017 eureka, Inc. All rights reserved. 18 ͦͷଞ  BUUSJCVUFT͸ίʔυ্Ͱఆٛ͢ΔͷΈ  SFWJFX͸4UPSZCPBSEYJC YNM ʹൺ΂ͯ֨ஈʹ͠қ͍  3FWJFXFS DPOqJDUमਖ਼͕҆қʹ

Slide 19

Slide 19 text

Copyright © 2017 eureka, Inc. All rights reserved. 19 AutoLayout  ͨͩɺKQ͸ະͩ"VUP-BZPVUΛ࢖͍ͬͯΔ  ݱߦҠߦ͢Δʹ͸5FYUVSF౳ͷֶशίετ͕ߴ͍  "VUP-BZPVUʹݶքΛײ͍ͯ͡Δҝɺݱࡏ͸ҠߦΛݕ౼த  ίʔυϨΠΞ΢τʹ͓͔ͨ͛͠ͰɺϨΠΞ΢τΤϯδϯͷҠߦ΋͠қ͍ ͸ ͣ

Slide 20

Slide 20 text

͔͠͠

Slide 21

Slide 21 text

ίʔυϨΠΞ΢τʹ͸ ͋Δఔ౓ͷਏ͕͋͞Δ

Slide 22

Slide 22 text

Copyright © 2017 eureka, Inc. All rights reserved. 22 ίʔυϨΠΞ΢τͷਏ͞  ίʔυྔͷ૿େ  "VUP-BZPVUͷ੍໿ఆٛ  ίʔυϏϧυϨΠΞ΢τ֬ೝίʔυͷαΠΫϧ  ͳΜͱ͔͜ͷਏ͞Λܰݮ͍ͨ͠

Slide 23

Slide 23 text

Copyright © 2017 eureka, Inc. All rights reserved. 23 ίʔυྔͷ૿େ  ίʔυྔͷ૿େࣗମ͸ͦΕ΄Ͳ໰୊Ͱ͸ͳ͘ɺݟ௨͕͠ѱ͘ͳΔ͜ͱ͕໰ ୊  4DPQFT  'BLF /BNFTQBDFT  "UPNJD%FTJHO

Slide 24

Slide 24 text

Copyright © 2017 eureka, Inc. All rights reserved. Clean Code: Scopes

Slide 25

Slide 25 text

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 })

Slide 26

Slide 26 text

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 })

Slide 27

Slide 27 text

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) }

Slide 28

Slide 28 text

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) }

Slide 29

Slide 29 text

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) }

Slide 30

Slide 30 text

Copyright © 2017 eureka, Inc. All rights reserved. Clean Code: Namespaces

Slide 31

Slide 31 text

Copyright © 2017 eureka, Inc. All rights reserved. 31 Namespaces  7JFXͷυϝΠϯΛҙࣝͤ͞Δ  υϝΠϯຖʹ໊લۭؒΛ࡞ͬͯ۠੾ΓɺείʔϓΛ࡞Δ

Slide 32

Slide 32 text

Copyright © 2017 eureka, Inc. All rights reserved. 32 Namespaces  ֤4DFOFʹఆٛ͢Δ7JFXΛٖࣅత/BNFTQBDFΛ࡞ͬͯάϧʔϐϯά͢Δ enum Card { enum SceneName {} enum Scene2Name {} }

Slide 33

Slide 33 text

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)

Slide 34

Slide 34 text

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)

Slide 35

Slide 35 text

Copyright © 2017 eureka, Inc. All rights reserved. Atomic Design

Slide 36

Slide 36 text

Copyright © 2017 eureka, Inc. All rights reserved. 36 Atomic Design  "UPNJD%FTJHOΛ ͋Δఔ౓ ҙࣝͯ͠7JFXύʔπΛ࡞੒͢Δ  7JFXͷ࠶ར༻ੑΛߴΊΔ

Slide 37

Slide 37 text

Copyright © 2017 eureka, Inc. All rights reserved. 37 Atomic Design "UPNT .PMFDVMFT 0SHBOJTNT 5FNQMBUFT 1BHFT

Slide 38

Slide 38 text

Copyright © 2017 eureka, Inc. All rights reserved. 38 Atomic Design "UPNT .PMFDVMFT 0SHBOJTNT 5FNQMBUFT 1BHFT  "UPNTϨϕϧͰ࡞͍ͬͯΔͱͭΒΈ͕ଟ͍ͷͰɺ.PMFTDVMFTϨϕϧͰ7JFX Λఆٛ͢Δ  ͱ͸͍͑ɺ6*ύʔπͷ෼ׂ͸σβΠφʔɺٴͼ4LFUDIϑΝΠϧͱরΒ͠߹ Θͤͳ͕Β֬ೝ͢΂͖

Slide 39

Slide 39 text

Copyright © 2017 eureka, Inc. All rights reserved. 39 Atomic Design: Generics as Templates  .PMFDVMFT 0SHBOJTNTΛ6*7JFXͰ࡞Δ  5FNQMBUFTΛ6*7JFX$POUSPMMFSͱ(FOFSJDTͰఆٛ͢Δ  ґଘੑΛ஫ೖͯ͠1BHFTΛ࡞Δ

Slide 40

Slide 40 text

Copyright © 2017 eureka, Inc. All rights reserved. 40 Atomic Design: Generics as Templates final class CardsViewController: 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() } }

Slide 41

Slide 41 text

Copyright © 2017 eureka, Inc. All rights reserved. 41 Atomic Design: Generics as Templates final class CardsViewController: 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() } }

Slide 42

Slide 42 text

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)

Slide 43

Slide 43 text

Copyright © 2017 eureka, Inc. All rights reserved. AutoLayoutͷ੍໿

Slide 44

Slide 44 text

Copyright © 2017 eureka, Inc. All rights reserved. 44 AutoLayout: Cartography  SPCC$BSUPHSBQIZͰ"VUP-BZPVU Λఆٛ͢Δ  "VUP-BZPVUͷఆٛͷείʔϓΛڧ ੍తʹڱΊΒΕΔ  $POUFOUIVHHJOHQSJPSJUZ౳͸7JFX ͷଐੑͱͯ͠ѻ͍ɺBQQMZ಺Ͱఆٛ ͢Δ

Slide 45

Slide 45 text

Copyright © 2017 eureka, Inc. All rights reserved. ࣮૷αΠΫϧ

Slide 46

Slide 46 text

Copyright © 2017 eureka, Inc. All rights reserved. 46 ࣮૷αΠΫϧ  2ʮίʔυϨΠΞ΢τͩͱ࣮ࡍͷϨΠΞ΢τΛίʔυ͔Β૝૾͠ʹ͍͘ͷ Ͱ͸ͳ͍͔ʯ  "͔֬ʹجຊతʹ͸Ϗϧυͯ֬͠ೝ͢Δ

Slide 47

Slide 47 text

Copyright © 2017 eureka, Inc. All rights reserved. 47 ࣮૷αΠΫϧ  QBJSTͷಛੑ্ɺ6TFS4UBUVTʹԠͯ͡ಈతʹ੾ΓସΘΔը໘͕ଟ͍  ͦ΋ͦ΋*#্ͷ੩తͳଥ౰ੑݕূ͕͠ਏ͍ঢ়ଶ  ͦΕͰ΋ίʔυϏϧυϨΠΞ΢τ֬ೝίʔυͷαΠΫϧ͸ݮΒ͠ ͯ։ൃΛߴ଎Խ͍ͨ͠  ϥϯλΠϜͰϨΠΞ΢τΛௐ੔ͭͭ֬͠ೝ͢Ε͹͍͍͡ΌΜ͔

Slide 48

Slide 48 text

Copyright © 2017 eureka, Inc. All rights reserved. 48 ࣮૷αΠΫϧ  3FWFBM  ϥϯλΠϜ7JFXσόοάπʔϧ  7JFXͷBUUSJCVUFT΍DPOTUSBJOUTΛϥϯ λΠϜ্Ͱมߋ  ݟͨ໨ΛϦΞϧλΠϜͰม͑ͳ͕Β࣮૷ αΠΫϧΛ࠷খݶʹ͢Δ  %&.0͠·͢

Slide 49

Slide 49 text

Copyright © 2017 eureka, Inc. All rights reserved. 49 ·ͱΊ  ӡ༻εςʔδʹೖΔͱɺ*OUFSGBDF#VJMEFS͸ਏ͔ͬͨ  ίʔυϨΠΞ΢τʹҠߦ͢Δ͜ͱͰɺมԽʹڧ͘ͳΔ  ʮมԽʹ࠷΋ରԠͰ͖Δੜ͖෺͕ੜ͖࢒Δʯ  ίʔυϨΠΞ΢τͷπϥϛ͸ɺ޻෉Ͱ௿ݮͰ͖Δ

Slide 50

Slide 50 text

Ϣʔβʹͱͬͯ΋ ΤϯδχΞʹͱͬͯ΋ շదͳϓϩμΫτΛ

Slide 51

Slide 51 text

Thank you IUUQTXXXOBTBHPWNJTTJPO@QBHFT/11OFXTFBSUIBUOJHIUIUNM