Slide 1

Slide 1 text

։ൃิॿπʔϧͷ ϕετϓϥΫςΟε Ӊࠤݟ ެี Fenrir Inc. iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 1

Slide 2

Slide 2 text

iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 2

Slide 3

Slide 3 text

ิॿπʔϧͱ͸ʁ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 3

Slide 4

Slide 4 text

ิॿπʔϧ » ϥΠϒϥϦ؅ཧπʔϧ » ϦιʔεऔΓࠐΈπʔϧ » ίʔυνΣοΫπʔϧ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 4

Slide 5

Slide 5 text

ϓϥΫςΟεΛߟ͑Δ » ͨͩิॿπʔϧΛಋೖ͢ΔͷͰͳ͘ɺߟ͑Α͏ » ͦ΋ͦ΋ͳͥπʔϧΛ࢖͏ͷ͔ʁ » ಋೖ͢ΔϝϦοτΛߟ͑Δ » Ͳ͏͍͏࢖͍ํ͕ྑ͍ͷ͔ʁ » ϝϦοτΛͭͿ͞ͳ͍ϓϥΫςΟεΛߟ͑Δ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 5

Slide 6

Slide 6 text

ϥΠϒϥϦ؅ཧ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 6

Slide 7

Slide 7 text

ϥΠϒϥϦ؅ཧπʔϧ » CocoaPods » Carthage » Swift Package Manager iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 7

Slide 8

Slide 8 text

ԿΛ͢Δπʔϧʁ » ֎෦ϥΠϒϥϦΛΞϓϦʹ؆୯ʹऔΓࠐΉ # CocoaPods ͷઃఆྫ target 'MyApp' do pod 'RxSwift', '~> 2.6.0' pod 'RxCocoa', '~> 2.6.0' end iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 8

Slide 9

Slide 9 text

Bad Practice πʔϧΛ࢖ΘͣʹϥΠϒϥϦΛೖΕΔ » ΞϓϦຊମͱϥΠϒϥϦ͕෼཭͞Εͳ͍ » ϥΠϒϥϦͷόʔδϣϯ͕෼͔Βͳ͘ͳΔ » ϥΠϒϥϦΛಋೖͨ͠౰ਓҎ֎ʹ͸෼͔Βͳ͍ » ϥΠϒϥϦ෦෼͸৮ͬͯ͸ͳΒ͵งғؾ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 9

Slide 10

Slide 10 text

Good Practice πʔϧΛ࢖ͬͯϥΠϒϥϦΛೖΕΔ » ΞϓϦຊମͱϥΠϒϥϦ͕෼཭͞ΕΔ » ϥΠϒϥϦͷόʔδϣϯ͕໌֬ʹͳΔ » ϥΠϒϥϦͷ௥Ճɾߋ৽ָ͕ʹͳΔ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 10

Slide 11

Slide 11 text

Bad Practice ϥΠϒϥϦΛϦϙδτϦʹೖΕͳ͍ » ֤Ϗϧυ؀ڥʹϥΠϒϥϦ؅ཧπʔϧ͕ඞཁ » ϥΠϒϥϦΛऔಘ͢ΔͨΊʹπʔϧΛ࣮ߦ͢Δ » ֎෦ϦϙδτϦ͕μ΢ϯͨ͠ΒϏϧυͰ͖ͳ͍ » πʔϧಋೖ͕ٯޮՌʹͳͬͯ͠·͏ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 11

Slide 12

Slide 12 text

Good Practice ϥΠϒϥϦΛϦϙδτϦʹೖΕΔ » ֤Ϗϧυ؀ڥʹϥΠϒϥϦ؅ཧπʔϧ͕ෆཁ » ֎෦ϦϙδτϦʹґଘͤͣϏϧυͰ͖Δ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 12

Slide 13

Slide 13 text

Bad Practice ϥΠϒϥϦͷιʔεΛ௚઀ฤू͢Δ » πʔϧΛ࢖͏ϝϦοτʢʹϥΠϒϥϦͷ௥Ճɾߋ৽ ָ͕ʹͳΔʣ͕ࣦΘΕΔ » ʮpod install ͠ͳ͍Ͱ͍ͩ͘͞ʯͱ͍͏஫ҙॻ ͖͕͋Δͱɾɾɾ » ΞϓϦͷϦϙδτϦʹϥΠϒϥϦͷฤू͕ೖΔ » ͲͷόʔδϣϯͷͲ͜Λฤू͔ͨ͠ෆ໌֬ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 13

Slide 14

Slide 14 text

Good Practice ϥΠϒϥϦΛ clone ͯ͠ฤू͢Δ » πʔϧΛ࢖͏ϝϦοτ͸ͦͷ·· » ΞϓϦͱผϦϙδτϦʹϥΠϒϥϦͷฤू͕ೖΔ » ͲͷόʔδϣϯͷͲ͜ʹΛฤू͔ͨ͠໌֬ʹͳΔ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 14

Slide 15

Slide 15 text

ϦιʔεऔΓࠐΈ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 15

Slide 16

Slide 16 text

ϦιʔεऔΓࠐΈπʔϧ » SwiftGen » R.swift » rdotm iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 16

Slide 17

Slide 17 text

ԿΛ͢Δπʔϧʁ » ΞϓϦ಺ͷը૾΍ςΩετͷѻָ͍͕ʹͳΔίʔυΛ ੜ੒ͯ͘͠ΕΔ // πʔϧͳ͠ͷ৔߹ let image = UIImage(named: "banana") // SwiftGen Λ࢖ͬͨ৔߹ let image = UIImage(asset: .Banana) iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 17

Slide 18

Slide 18 text

Bad Practice ςΩετΛιʔείʔυʹ௚઀ॻ͘ label.text = "͜Μʹͪ͸" » දࣔςΩετ͕Ͳ͜Ͱࢦఆ͞Ε͍ͯΔ͔෼͔Γʹ͍͘ » ݕࡧͮ͠Β͍ » ैͬͯɺमਖ਼ͮ͠Β͍ʢಛʹޙͰमਖ਼͢Δͱ͖ʣ » ϩʔΧϥΠζͷͱ͖ʹࠔΔ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 18

Slide 19

Slide 19 text

Good Practice 1 ςΩετΛ strings ϑΝΠϧʹஔ͘ label.text = NSLocalizedString("label_hello") » දࣔςΩετ͕Ͳ͜Ͱࢦఆ͞Ε͍ͯΔ͔෼͔Γ΍͍͢ » ݕࡧ͠΍͍͢ » ϩʔΧϥΠζͷͱ͖ʹָʹͳΔ » ͨͩ͠ɺςΩετΛ strings ʹஔ͘ͷ͕໘౗ͳؾ࣋ ͪ͸͋Δʢ৺ཧతෛ୲ʣ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 19

Slide 20

Slide 20 text

Good Practice 2 ϦιʔεऔΓࠐΈπʔϧΛ࢖͏ // SwiftGen ͷ৔߹ label.text = tr(.LabelHello) » strings ͷΩʔจࣈྻͷϛε͕ͳ͘ͳΔ » ίϯύΠϧ࣌ʹνΣοΫ͞ΕΔ » ςΩετΛ strings ʹஔ͘৺ཧతෛ୲ͷܰݮ » ίʔυ͕ॻ͖΍͘͢ͳΔͷ͔ͩΒ΍͓ͬͯ͜͏ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 20

Slide 21

Slide 21 text

ίʔυνΣοΫ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 21

Slide 22

Slide 22 text

ίʔυνΣοΫπʔϧ » SwiftLint » Tailor » OCLint iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 22

Slide 23

Slide 23 text

ԿΛ͢Δπʔϧʁ » ޷·͘͠ͳ͍ίʔυΛݕग़͢Δ » ίʔυϑΥʔϚοτΛ੔͑Δ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 23

Slide 24

Slide 24 text

Bad Practice ίʔυνΣοΫΛ࣮ߦ͠ͳ͍ » ڊେͳΫϥε » ෼ذ͕ଟ͗͢Δϝιου » ෆద੾ͳ force cast iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 24

Slide 25

Slide 25 text

Good Practice 1 ίʔυνΣοΫΛ࣮ߦ͢Δ » ޷·͘͠ͳ͍ίʔυ͕ػցతʹൃݟͰ͖Δ » ૣظൃݟɺૣظ࣏ྍ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 25

Slide 26

Slide 26 text

Good Practice 2 Ϗϧυ࣌ʹࣗಈతʹίʔυνΣοΫ » Build Phase ʹπʔϧ࣮ߦΛೖΕΔ » πʔϧͷ࣮ߦΛ๨Εͣʹ͢Ή » Warning / Error දࣔ͞ΕΔͷͰରԠָ͕ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 26

Slide 27

Slide 27 text

ิ଍ طଘͷϓϩδΣΫτʹಋೖ͢Δʹ͸ » طଘϓϩδΣΫτʹಋೖ͢ΔͱϏοΫϦ͢Δ΄Ͳଟ͘ ͷ Warning / Error ͕ग़Δ » ͦΕͰ΋ಋೖ͸ͨ͠ํ͕͍͍ » νΣοΫϧʔϧΛܰݮͯ͠Ͱ΋ಋೖ͓ͯ͘͠ » ͍ͬͨΜಋೖͯ͠͠·͑͹৺ཧతෛ୲͕ܰ͘ͳΔ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 27

Slide 28

Slide 28 text

Bad Practice ίʔυνΣοΫͷ݁ՌΛ์ஔ͢Δ » Warning Λ์ஔ͢Δͷ͕౰ͨΓલʹͳΔ » ରॲ͢΂͖ Warning Λݟམͱ͢ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 28

Slide 29

Slide 29 text

Good Practice ίʔυνΣοΫͷ݁Ռʹ͙͢ରॲ͢Δ » ৗʹ Warning Λͳ͘͢ » ରॲ͢΂͖ Warning Λݟམͱ͞ͳ͍ » Warning ʹରॲ͢Δͷ͕େมͳΒɺ͍ͬͦͷ͜ͱν ΣοΫϧʔϧΛܰݮͯ͠͠·͏ » ίʔυνΣοΫΛܧଓ͢Δ΄͏͕େࣄ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 29

Slide 30

Slide 30 text

Bad Practice ίʔυϑΥʔϚοτΛߦΘͳ͍ » ΧοίͷҐஔͱ͔εϖʔεͷೖΕํͱ͔όϥόϥ » ϧʔϧ͕͋ͬͯ΋कΔͷ͸େม » ϑΥʔϚοτͷϧʔϧΛ͍֮͑ͯͳ͍ͱμϝ » ͏͔ͬΓΦϨΦϨϧʔϧͰॻ͍ͯ͠·͏ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 30

Slide 31

Slide 31 text

Good Practice ίʔυϑΥʔϚοτΛπʔϧͰߦ͏ » ྫɿSwiftLint ͳΒ swiftlint autocorrect » ΧοίͷҐஔͱ͔εϖʔεͷͷೖΕํͱ͔উखʹमਖ਼ ͞ΕΔ » ϑΥʔϚοτͷϧʔϧ͸๨ΕΑ͏ » πʔϧʹ೚ͤΑ͏ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 31

Slide 32

Slide 32 text

·ͱΊ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 32

Slide 33

Slide 33 text

·ͱΊ » ͨͩπʔϧΛಋೖ͢ΔͷͰͳ͘ɺߟ͑Α͏ » ಋೖ͢ΔϝϦοτΛߟ͑Δ » ϝϦοτΛͭͿ͞ͳ͍ϓϥΫςΟεΛߟ͑Δ » ߟ͑ͨ͏͑ͰπʔϧΛೖΕΔͱָʹͳΔ iOS ΞϓϦ։ൃͷิॿπʔϧͷϕετϓϥΫςΟε (@usamik26) - iOSDC 2016 33