Slide 1

Slide 1 text

4FMG%PDVNFOUJOH$PEF
 ͷεεϝ forJ04%$3FKFDU$POGFSFODFEBZT

Slide 2

Slide 2 text

r੕໺ܙྤ lզʑΤϯδχΞ͸େͬݏ͍ͳ͜ͱ͕Cͭ͋Δ Cͭ໨͸υΩϡϝϯτΛॻ͘͜ͱɻ Cͭ໨͸υΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ
 ίʔυΛอक͢Δ͜ͱͩɻz

Slide 3

Slide 3 text

r੕໺ܙྤ lզʑΤϯδχΞ͸େͬݏ͍ͳ͜ͱ͕Cͭ͋Δ Cͭ໨͸υΩϡϝϯτΛॻ͘͜ͱɻ Cͭ໨͸υΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ
 ίʔυΛอक͢Δ͜ͱͩɻz

Slide 4

Slide 4 text

r੕໺ܙྤ lզʑΤϯδχΞ͸େͬݏ͍ͳ͜ͱ͕Cͭ͋Δ Cͭ໨͸υΩϡϝϯτΛॻ͘͜ͱɻ Cͭ໨͸υΩϡϝϯτͷͳ͍ଞਓ͕ॻ͍ͨ
 ίʔυΛอक͢Δ͜ͱͩɻz ʊਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹͩͬͨΒ࠷ॳ͔ΒυΩϡϝϯτͱͯ͠΋ɹʻ ʼɹ࢖͑ΔίʔυΛॻ͚͹ສࣄղܾͳͷͰ͸ ɹʻ ʉ:?:?:?:?:?:?:?:?::?:?:?:?:?:?:?:?:ʉ

Slide 5

Slide 5 text

} var employedBy = "YUMEMI Inc." var job = "iOS Developer" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ iOSDC 2018 CfP શ෦མͪͨਏ͍ """ class Me: Developable, Talkable {

Slide 6

Slide 6 text

໔੹આ໌ w "͜ͷτʔΫ͸ίʔσΟϯάνοϓεతͳ࿩Ͱ͋Δ w #͜ͷτʔΫ͸υΩϡϝϯτࣗಈੜ੒ͷ࿩Ͱ͸ͳ͍

Slide 7

Slide 7 text

rӳࣙ࿠ l4FMGEPDVNFOUJOHDPEFɿࣗݾจॻԽίʔυz

Slide 8

Slide 8 text

let s = (0 ..< 50) .map({ _ in Int.random(in: 0 ... 100) }) .filter({ $0 >= 60 }) .reduce(0, +)

Slide 9

Slide 9 text

let s = (0 ..< 50) .map({ _ in Int.random(in: 0 ... 100) }) .filter({ $0 >= 60 }) .reduce(0, +)

Slide 10

Slide 10 text

private extension Int { var isPassed: Bool { return self >= 60 } } let numberOfStudents = 50 let studentsScoreList = (0 ..< numberOfStudents) .map({ _ -> Int in let score = Int.random(in: 0 ... 100) return score }) let passedStudentsScoreList = studentsScoreList .filter({ $0.isPassed }) let totalScoreOfAllPassedStudents = passedStudentsScoreList .reduce(0, +) ͳΔ΄Ͳɺςετʹ߹֨ͨ͠ੜెͷ
 ఺਺ͷ߹ܭͶʂ

Slide 11

Slide 11 text

r੕໺ܙྤ l4FMGEPDVNFOUJOHDPEFɿࣗ෼ࣗ਎ͷҙຯΛ
 ͖ͪΜͱઆ໌Ͱ͖͍ͯΔίʔυz

Slide 12

Slide 12 text

ͳͥ4FMG%PDVNFOUJOH$PEFʁ w ಉ͜͡ͱΛʮίʔυʯͱʮυΩϡϝϯτʯ྆ํͰॻ͘ ͱ͍͏ೋ౓ख͕ؒݮΔɻ w w w w w w w w ίʔυϨϏϡʔ͕ΑΓ͠΍͘͢ͳΔɻ w ίϛολʔͷҙਤ͕ಡΈऔΓ΍͘͢ͳΔ w w w w w w w w w w w อक͢Δ࣌ʹ໰୊ՕॴΛಛఆ͠΍͘͢ͳΔ w w w w w w

Slide 13

Slide 13 text

4FMG%PDVNFOUJOH$PEF΁ͷΞϓϩʔν w ՄಡੑʹؾΛ͚ͭΔ w ໰୊Λࡉ͔͘ந৅Խ w ҉໧ͳલఏΛͳ͘͢

Slide 14

Slide 14 text

ՄಡੑʹؾΛ͚ͭΔ

Slide 15

Slide 15 text

ՄಡੑʹؾΛ͚ͭΔʢʣ ͳΜͷ 63-ͩΖʁ let url = URL(string: "https://iosdc.jp/2018/")!

Slide 16

Slide 16 text

ՄಡੑʹؾΛ͚ͭΔʢʣ let apiBaseURL = URL(string: "https://iosdc.jp/2018/")! "1*ͷ ϕʔε63-ͩͶʂ

Slide 17

Slide 17 text

r୭͔ l؆ܿ͞ΑΓɺΘ͔Γ΍͢͞z

Slide 18

Slide 18 text

ՄಡੑʹؾΛ͚ͭΔʢʣ class Player { // ... var allowsMagic: Bool { return // ຐ๏͕࢖͑Δ͔Ͳ͏͔ͷ൑ఆ } } ຐ๏Λ ڐՄʜʁ

Slide 19

Slide 19 text

ՄಡੑʹؾΛ͚ͭΔʢʣ class Player { // ... var canUseMagic: Bool { return // ຐ๏͕࢖͑Δ͔Ͳ͏͔ͷ൑ఆ } } ຐ๏͕ ࢖͑Δ͔Ͳ͏͔͔ʂ

Slide 20

Slide 20 text

r୭͔ lޡղͷͳ͍දݱʹؾΛ͚ͭΑ͏z

Slide 21

Slide 21 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, _ baseView: UIView) { baseView.addSubview(subview) } addSubview(avatarView, contentView) Ͳ͕ͬͪͲͬͪʹ ௥Ճ͞ΕΔͷʜʁ

Slide 22

Slide 22 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(subview: UIView, baseView: UIView) { baseView.addSubview(subview) } addSubview(subview: avatarView, baseView: contentView) ଟ෼avatarView͕ࢠϏϡʔͰ contentView͕਌Ϗϡʔʁ

Slide 23

Slide 23 text

ՄಡੑʹؾΛ͚ͭΔʢʣ avatarViewΛ contentViewͷ্ʹ௥ՃͩͶʂ func addSubview(_ subview: UIView, onto baseView: UIView) { baseView.addSubview(subview) } addSubview(avatarView, onto: contentView)

Slide 24

Slide 24 text

r୭͔ lҾ਺ϥϕϧΛ͏·͘׆༻͠Α͏z

Slide 25

Slide 25 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView) { baseView.addSubview(subview) } addSubview(avatarView, onto: contentView)

Slide 26

Slide 26 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded) ಡΈ΍͍͕͢
 จ๏ΤϥʔͰ͋Δ

Slide 27

Slide 27 text

r੕໺ܙྤ l4XJGUͷจ๏ʹ།Ұʹͯ͠࠷େͷෆຬ఺͸
 ޙஔϥϕϧ͕ͳ͍͜ͱz

Slide 28

Slide 28 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded)

Slide 29

Slide 29 text

ՄಡੑʹؾΛ͚ͭΔʢʣ enum AddSubviewPostLabel { case ifNeeded } func addSubview(_ subview: UIView, onto baseView: UIView, _ label: AddSubviewPostLabel) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, .ifNeeded) ߈ུ"ɿޙஔϥϕϧ༻ͷenumҾ਺Λ׶͑ͯ࡞Δ ɿར༻෦ΛಡΉͱ͔ͳΓಡΈ΍͍͢ ɿenumΛΘ͟Θ͟ఆٛ͠ͳ͍ͱ͍͚ͳ͍ɺ໘౗ष͍ɺ໊લিಥ͠΍͍͢

Slide 30

Slide 30 text

ՄಡੑʹؾΛ͚ͭΔʢʣ func addSubview(_ subview: UIView, onto baseView: UIView, ifNeeded: ()) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubview(avatarView, onto: contentView, ifNeeded: ()) ߈ུ#ɿޙஔϥϕϧ༻ͷμϛʔҾ਺Λ࡞Δ ɿԿ΋௥ՃͰఆٛ͢Δඞཁ͕ͳ͍ɺָ ɿར༻෦ΛಡΉ࣌ඍົʹͳͥ͜ͷҾ਺౉ͯ͠Δͷ͔Λߟ͑ͯ͠·͍ͦ͏

Slide 31

Slide 31 text

ՄಡੑʹؾΛ͚ͭΔʢʣ ߈ུ$ɿ࠷ॳ͔ΒޙஔϥϕϧΛ࡞Βͳ͍ ɿճΓ͘Ͳ͍ϫʔΫΞϥ΢ϯυ͕ཁΒͳ͍ ɿӳจ๏ͱͯͪ͠ΐͬͱඍົͳͷͰ΋͏ͪΐͬͱ໊લͷ޻෉͕ඞཁ͔΋ func addSubviewIfNeeded(_ subview: UIView, onto baseView: UIView) { if !baseView.subviews.contains(where: { $0 === subview }) { baseView.addSubview(subview) } } addSubviewIfNeeded(avatarView, onto: contentView)

Slide 32

Slide 32 text

r੕໺ܙྤ l݁࿦ɿޙஔϥϕϧཉ͍͠ɻz

Slide 33

Slide 33 text

ՄಡੑʹؾΛ͚ͭΔʢʣ class SomeSequence { private var numbers: [Int] = [3, 2, 1] private var isSorted: Bool = false // ... func getSorted() -> [Int] { self.numbers = self.numbers.sorted(by: <) self.isSorted = true return self.numbers } } let sequence = SomeSequence() // Կ͔ॲཧ... let sorted = sequence.getSorted() ฒͼସ͑ΒΕͨ഑ྻΛऔΖ͏ͱͨ͠
 ͚ͩͳͷʹsequenceͷঢ়ଶ͕มΘͬͨ

Slide 34

Slide 34 text

ՄಡੑʹؾΛ͚ͭΔʢʣ class SomeSequence { private var numbers: [Int] = [3, 2, 1] private var isSorted: Bool = false // ... @discardableResult func sort() -> [Int] { self.numbers = self.numbers.sorted(by: <) self.isSorted = true return self.numbers } } let sequence = SomeSequence() // Կ͔ॲཧ... let sorted = sequence.sort() ͜ͷϝιου͸໭Γ஋͕͋Δ͕
 ෭࡞༻΋͋Δϝιουͩʂ

Slide 35

Slide 35 text

r୭͔ l෭࡞༻͕͋Δ͔Ͳ͏͔Λ໌ࣔ͠Α͏z

Slide 36

Slide 36 text

IUUQTTXJGUPSHEPDVNFOUBUJPOBQJEFTJHOHVJEFMJOFTTUSJWFGPSqVFOUVTBHF

Slide 37

Slide 37 text

ՄಡੑʹؾΛ͚ͭΔ w ؆ܿ͞ΑΓɺΘ͔Γ΍͢͞ w ޡղͷͳ͍දݱʹؾΛ͚ͭΑ͏ w Ҿ਺ϥϕϧΛ͏·͘׆༻͠Α͏ w ෭࡞༻͕͋Δ͔Ͳ͏͔Λ໌ࣔ͠Α͏

Slide 38

Slide 38 text

クイズ:象さんを冷蔵庫に入れる手順は? 1.冷蔵庫のドアを開ける 2.象さんを冷蔵庫の中に入れる 3.冷蔵庫のドアを閉める

Slide 39

Slide 39 text

ࡉ͔͘ந৅Խ

Slide 40

Slide 40 text

ࡉ͔͘ந৅Խ class SomeScreen { func presentWebPage() { // ΞυϨεόʔΛ... // ໭ΔϘλϯΛ... // ... // จࣈྻΛ URL ʹ... // URL ͔ΒϦΫΤετΛ... // ... // จࣈίʔυΛ... // ಺༰ͷϨΠΞ΢τΛ... // ... // } }

Slide 41

Slide 41 text

ࡉ͔͘ந৅Խ class SomeScreen { func presentWebPage() { // ॳظ WebPage ը໘Λ࡞Δ // ࡞ͬͨ WebPage ը໘ʹભҠ͢Δ // ભҠ͕ऴΘͬͨΒ WebPage ը໘ͰಡΈࠐΉ } }

Slide 42

Slide 42 text

ࡉ͔͘ந৅Խ class SomeScreen { func presentWebPage() { let screen = WebPageScreen() self.present(screen, completion: { screen.loadAddress("user_defined") }) } }

Slide 43

Slide 43 text

ࡉ͔͘ந৅Խ class SomeScreen { // presentWebPage private func present(_ screen: WebPageScreen, completion: () -> Void) { // ભҠॲཧʹઐ೦ } } class WebPageScreen { // ը໘ߏ੒ʹઐ೦ func loadAddress(_ address: String) { // ಡΈࠐΈॲཧʹઐ೦ } }

Slide 44

Slide 44 text

໰୊Λࡉ͔͘ந৅Խ͢Δ w ͍͖ͳΓ۩ମతͳ࣮૷Λߟ͑ͳ͍ w ෳࡶͳ໰୊͸ͦ΋ͦ΋ߟ͑Δͷ͸೉͍͠ w ؆୯ͳ໰୊Ͱ΋͋Δఔ౓ͬ͘͟ΓͳΠϝʔδ͕͍͍ w ෳࡶͳػೳ΄Ͳɺͪΐͬͱͣͭ෼ׂ͢Δ w Ұ౓ʹߟ͑Δ໰୊ΛߜΕΔ w 5%%ʹ΋௨͡Δߟ͑ํ w ςετ΋ॻ͖΍͘͢ͳΔͱ͍͏خ͍͠෭࡞༻ w ෦඼ͷ੹຿ʹઐ೦͢Δ w ඞཁʹԠͯ͡%FMFHBUF΍$MPTVSFʹؙ౤͛

Slide 45

Slide 45 text

҉໧ͳલఏΛͳ͘͢

Slide 46

Slide 46 text

҉໧ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { var childViews: [UIView] = [] // ... func scrollToView(at index: Int) { self.contentOffset.x = self.bounds.width * CGFloat(index) } } த਎ಡΜͰΈͨΒ
 ͜Ε͸֤childViewͷ෯͕ࣗ਎ͷ෯ͱಉ͡
 ͱ͍͏લఏͰಈ͍ͯΔॲཧͩ

Slide 47

Slide 47 text

҉໧ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { var childViews: [UIView] = [] // ... func scrollToView(at index: Int) { self.contentOffset = self.childViews[index].frame.origin } } ͍ͭͲ͜Ͱ୭ʹݺ͹ΕΑ͏ͱඞͣ ֘౰childView͕දࣔ͞ΕΔॲཧͰ͋Δ 
 ʢchildViewͷϨΠΞ΢τͱ͍͏҉໧ͳલఏʹ ґଘ͠ͳ͍ʣ

Slide 48

Slide 48 text

҉໧ͳલఏΛͳ͘͢ class SomeContainerView: UIScrollView { private var childViews: [UIView] = [] // ... func scrollToChildView(at index: Int) { let childView = self.childViews[index] assert(childView.superview === self) self.contentOffset = childView.frame.origin } } Ͳ͏ͯ͠΋֎ͤͳ͍લఏ͸ ඞͣ໌ࣔ͢Δ

Slide 49

Slide 49 text

҉໧ͳલఏΛͳ͘͢ w ͍ͭͲ͜Ͱ୭ʹݺ͹Εͯ΋ಉ݁͡ՌʹͳΔΑ͏ʹ࡞Δ w Ͳ͏ͯ͠΋ඞཁͳલఏΛ໌ࣔ͢Δ w લఏΛҾ਺ʹͰ͖Ε͹Ҿ਺ʹ͢Δ w લఏΛҾ਺ʹͰ͖ͳ͚Ε͹໊લʹ૊ΈࠐΉ w ໊લʹ૊ΈࠐΉʹ΋೉͍͠৔߹͸࣮૷ͰΞαʔτ

Slide 50

Slide 50 text

4FMG%PDVNFOUJOH$PEF΁ͷΞϓϩʔν w ՄಡੑʹؾΛ͚ͭΔ w ໰୊Λࡉ͔͘ந৅Խ w ҉໧ͳલఏΛͳ͘͢

Slide 51

Slide 51 text

͡Ό͋4FMG%PDVNFOUJOH$PEFͰॻ͍ͨϓϩάϥϜ͸
 ίϝϯτ΍υΩϡϝϯτ͕શ͘ཁΒͳ͘ͳΔͷʁ

Slide 52

Slide 52 text

4FMG%PDVNFOUJOH$PEF͚ͩͰ͸଍Γͳ͍ w $PEF͸ʮ8IBUʯͱʮ)PXʯ͚͔ͩ͠આ໌Ͱ͖ͳ͍ w ϓϩάϥϜ΍ϓϩδΣΫτΛཧղ͢ΔͨΊʹ͸ ʮ8IZʯ΋ඞཁʢΠϨΪϡϥʔͳ࢓༷આ໌ͳͲʣ w υΩϡϝϯτ΍ίϝϯτͰ8IBUͱ)PXΛઆ໌͠ͳ ͯ͘ࡁΉ୅ΘΓʹɺ8IZͷઆ໌ʹઐ೦Ͱ͖Δ w ݁Ռͱͯ͠ඞཁՕॴ΍ϘϦϡʔϜ͕ݮΔʂ

Slide 53

Slide 53 text

4FMG%PDVNFOUJOH$PEFͰ
 ফ໣ͷগͳ͍։ൃϥΠϑΛ