Slide 1

Slide 1 text

takasek؂ಜ ࠷৽࡞ ɹ܅ ͷ ࢀ র ͸ ɻ 2016/9/16 Վ෣ب࠲.tech #11 1

Slide 2

Slide 2 text

·ͩdeinitͨ͜͠ͱͷͳ͍܅ (class) Λɺ ڧࢀর͍ͯ͠Δɻ 2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

ɹ࿩͕௕͍ͷͰɺ ɹ·ͣ͸݁࿦ɻ 5

Slide 6

Slide 6 text

classͷ Πϯελϯεϝιου͸ self΁ͷڧࢀরΛ ͍࣋ͬͯΔͷͰ ؾΛ͚ͭΖɻ 6

Slide 7

Slide 7 text

Ͱ͸ ຊ୊ελʔτ! 7

Slide 8

Slide 8 text

ϘλϯΛͻͱ͚ͭͩ࣋ͭ UIViewαϒΫϥεͷίϯϙʔωϯτΛ࡞ͬͨͱ͠·͢ɻ final class MyComponent: UIView { @IBOutlet private var button: UIButton! //Button͕ԡ͞ΕͨΒɺcallbackΛ࣮ߦ var callback: (() -> Void)? @IBAction func didButtonPush() { callback?() } } 8

Slide 9

Slide 9 text

͜ͷίϯϙʔωϯτʹcallbackͱͯؔ͠਺Λ౉ͯ͠ɺ ViewControllerͰॲཧͰ͖ΔΑ͏ʹ͠·͢ɻ final class ViewController: UIViewController { @IBOutlet private var component: MyComponent! override func viewDidLoad() { super.viewDidLoad() component.callback = { ͳΜ͔ॲཧΛ͢Δ() } } deinit { print("deinit") } } 9

Slide 10

Slide 10 text

final class ViewController: UIViewController { @IBOutlet private var component: MyComponent! override func viewDidLoad() { super.viewDidLoad() component.callback = { ͳΜ͔௕͍ॲཧ() if something.isͳΜͨΒ { ଞͷ௕͍ॲཧ() } else { something.΄͛΄͛() } } } deinit { print("deinit") } } ! callbackͷத਎͕๲ΒΜͰ͖ͨ 10

Slide 11

Slide 11 text

final class ViewController: UIViewController { @IBOutlet private var component: MyComponent! override func viewDidLoad() { super.viewDidLoad() component.callback = { self.doHogehoge() } } private func doHogehoge() { ... } deinit { print("deinit") } } ☺ ϝιουʹ੾Γग़ͯ͠ɺ͖ͬ͢Γ 11

Slide 12

Slide 12 text

!…଴ͯΑʁ component.callback = { self.doHogehoge() } !Ϋϩʔδϟͷதʹself͕ొ৔͢Δ৔߹͸ɺ॥؀ ࢀরʹؾΛ͚ͭΔඞཁ͕͋ΔΜͩͬͨͳ…ʁ 12

Slide 13

Slide 13 text

!॥؀ࢀর self ➡ self.component self.component ➡ self.component.callback self.component.callback ➡ self ɹ let closure = { //Ϋϩʔδϟ͕selfΛڧࢀরͰΩϟϓνϟ͍ͯ͠Δ self.ʙʙʙ } 13

Slide 14

Slide 14 text

! ͳΒ͜ΕͰ… component.callback = { [weak self] in self?.doHogehoge() } ! ऑࢀরʹͯ͠ɺ᠘Λ՚ྷʹճආʂ 14

Slide 15

Slide 15 text

final class ViewController: UIViewController { @IBOutlet private var component: MyComponent! override func viewDidLoad() { super.viewDidLoad() component.callback = { [weak self] in self?.doHogehoge() } } private func doHogehoge() { // ... } deinit { print("deinit") } } ɹ ☺ ͖ͬ͢ΓΞήΠϯ 15

Slide 16

Slide 16 text

... { ... component.callback = { [weak self] in self?.doHogehoge() } } private func doHogehoge() { // ... } ! ͍΍ɺͰ΋଴ͯΑ… ɹ ͜ͷΫϩʔδϟɺແବ͡Όͳ͍͔ʁ 16

Slide 17

Slide 17 text

! ͦ͏ͩɺSwiftͰ͸ ɹ ؔ਺΋ୈҰڃΦϒδΣΫτͩ final class MyComponent: UIView { var callback: (() -> Void)? } final class ViewController: UIViewController { private func doHogehoge() { } ! ͦͯ͠ϝιου doHogehoge ΋ ɹ ϓϩύςΟ callback ͱಉ͡ ()->Void ܕ ɹ ͱ͍͏͜ͱ͸… 17

Slide 18

Slide 18 text

ɹ ɹ component.callback = doHogehoge ɹ ! …͜Εͩʂ 18

Slide 19

Slide 19 text

final class ViewController: UIViewController { @IBOutlet private var component: MyComponent! override func viewDidLoad() { super.viewDidLoad() component.callback = doHogehoge // ! } private func doHogehoge() { // ... } deinit { print("deinit") } } ! ܕ͸߹ͬͯΔʂ ɹ ͜ͷॻ͖ํ…coool͡Όͳ͍!? ɹ doHogehogeͷதͰ͸self࢖ͬͯͳ͍͠ʂ 19

Slide 20

Slide 20 text

ͱࢥͬͨΒɺҧͬͨ 20

Slide 21

Slide 21 text

deinit { print("deinit") } ! deinitɺݺ͹Εͯͳ͍ΜͰ͚͢Ͳʂʂ 21

Slide 22

Slide 22 text

!॥؀ࢀরͷग़དྷ্͕Γ self ➡ self.component self.component ➡ self.doHogehogeϝιου self.doHogehogeϝιου ➡ self ɹɹɹɹɹɹɹɹɹɹɹɹɹ "!? 22

Slide 23

Slide 23 text

ϝιου͸҉໧తʹ self΁ͷڧࢀরΛ ͍࣋ͬͯΔ 23

Slide 24

Slide 24 text

ϝιου͕functionܕ ͔ͩΒͱݴͬͯɺ ܰ཰ʹଞͷܕʹ౉ͯ͠ ॴ༗ͤͯ͞͸͍͚ͳ͍ 24

Slide 25

Slide 25 text

͜͜Ͱ ಥવͷΫΠζʂ 25

Slide 26

Slide 26 text

͜Ε͔Βɺ͍Ζ͍ΖͳfunctionܕΛɺ͍Ζ͍ΖͳܗͰ component.callback ϓϩύςΟʹ౉͠·͢ɻ ָ͠Έํ ·ͣɺίʔυΛఏࣔ͠·͢ɻ ఏࣔ͞Εͨίʔυ͕॥؀ࢀরΛى͔͜͢ɺͬ͘͡Γߟ͑ ͯΈ·͠ΐ͏ɻ ϖʔδΛΊ͘Ε͹౴͑߹Θͤɻ ݁Ռʢ ݈શ! or ॥؀ࢀর" ʣ͕෼͔Γ·͢ɻ ΫΠζؾ෼Ͱ௅ઓͯ͠Έ͍ͯͩ͘͞Ͷɻ 26

Slide 27

Slide 27 text

ݕূ༻ϓϩδΣΫτ https://github.com/ takasek/ RecursiveReferenceSample projectΛϏϧυͯ͠ɺࣗ෼Ͱ ಈ͔ͯ͠Έͯ΋ָ͍͔͠΋͠ Ε·ͤΜɻ 27

Slide 28

Slide 28 text

here we go! 28

Slide 29

Slide 29 text

ϝιου final class ViewController: UIViewController { private func doHogeMethod() { print("method") } func configureButtonAction() { component.callback = doHogeMethod } } ݁Ռ͸… 29

Slide 30

Slide 30 text

ϝιου final class ViewController: UIViewController { private func doHogeMethod() { print("method") } func configureButtonAction() { component.callback = doHogeMethod } } ݁Ռ: ॥؀ࢀর! 30

Slide 31

Slide 31 text

ϝιου([unowned self]ͳΫϩʔδϟ͔ΒݺͿ) final class ViewController: UIViewController { private func doHogeMethod() { print("method") } func configureButtonAction() { component.callback = { [unowned self] in self.doHogeMethod() } } } ݁Ռ͸… 31

Slide 32

Slide 32 text

ϝιου([unowned self]ͳΫϩʔδϟ͔ΒݺͿ) final class ViewController: UIViewController { private func doHogeMethod() { print("method") } func configureButtonAction() { component.callback = { [unowned self] in self.doHogeMethod() } } } ݁Ռ: ݈શ! 32

Slide 33

Slide 33 text

functionܕϓϩύςΟ final class ViewController: UIViewController { let functionTypeProperty = { print("function-type property") } func configureButtonAction() { component.callback = functionTypeProperty } } ݁Ռ͸… 33

Slide 34

Slide 34 text

functionܕϓϩύςΟ final class ViewController: UIViewController { let functionTypeProperty = { print("function-type property") } func configureButtonAction() { component.callback = functionTypeProperty } } ݁Ռ: ݈શ! 34

Slide 35

Slide 35 text

functionܕϓϩύςΟ(தͰselfΛ࢖͏) final class ViewController: UIViewController { let functionTypePropertyUsingSelf = { print("function-type property using self", self) } func configureButtonAction() { component.callback = functionTypePropertyUsingSelf } } ݁Ռ͸… 35

Slide 36

Slide 36 text

functionܕϓϩύςΟ(தͰselfΛ࢖͏) final class ViewController: UIViewController { let functionTypePropertyUsingSelf = { print("function-type property using self", self) } func configureButtonAction() { component.callback = functionTypePropertyUsingSelf } } ݁Ռ: ݈શ! 36

Slide 37

Slide 37 text

let functionTypePropertyUsingSelf = { print("function-type property using self", self) } func configureButtonAction() { component.callback = functionTypePropertyUsingSelf } ɹ !଴ͬͯ଴ͬͯɺ͜ΕϚδͰ॥؀ࢀরى͖ͳ͍ͷ!? ͬͯͳΓ·͢ΑͶɻ ϚδͰ͢ɻ 37

Slide 38

Slide 38 text

ؾΛऔΓ௚ͯ͠ɻ ͜͜·Ͱ͸classΠϯελϯεͷϝϯόฤͰ͕ͨ͠ɺ ͔͜͜Β͸ϩʔΧϧείʔϓฤͰ͢ɻ func configureButtonAction() ͷதͰؔ਺Λ࡞Δύλʔϯɻ 38

Slide 39

Slide 39 text

ϩʔΧϧfunction final class ViewController: UIViewController { func configureButtonAction() { func localFunc() { print("local func") } component.callback = localFunc } } ݁Ռ͸… 39

Slide 40

Slide 40 text

ϩʔΧϧfunction final class ViewController: UIViewController { func configureButtonAction() { func localFunc() { print("local func") } component.callback = localFunc } } ݁Ռ: ݈શ! 40

Slide 41

Slide 41 text

ϩʔΧϧfunction(தͰselfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { func localFuncUsingSelf() { print("local func using self", self) } component.callback = localFuncUsingSelf } } ݁Ռ͸… 41

Slide 42

Slide 42 text

ϩʔΧϧfunction(தͰselfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { func localFuncUsingSelf() { print("local func using self", self) } component.callback = localFuncUsingSelf } } ݁Ռ: ॥؀ࢀর! 42

Slide 43

Slide 43 text

ϩʔΧϧΫϩʔδϟ final class ViewController: UIViewController { func configureButtonAction() { let localClosure = { print("local closure") } component.callback = localClosure } } ݁Ռ͸… 43

Slide 44

Slide 44 text

ϩʔΧϧΫϩʔδϟ final class ViewController: UIViewController { func configureButtonAction() { let localClosure = { print("local closure") } component.callback = localClosure } } ݁Ռ: ݈શ! 44

Slide 45

Slide 45 text

ϩʔΧϧΫϩʔδϟ(தͰselfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { let localClosureUsingSelf = { print("local closure using self", self) } component.callback = localClosureUsingSelf } } ݁Ռ͸… 45

Slide 46

Slide 46 text

ϩʔΧϧΫϩʔδϟ(தͰselfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { let localClosureUsingSelf = { print("local closure using self", self) } component.callback = localClosureUsingSelf } } ݁Ռ: ॥؀ࢀর! 46

Slide 47

Slide 47 text

ϩʔΧϧΫϩʔδϟ(தͰunowned selfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { let localClosureUsingUnownedSelf = { [unowned self] in print("local closure using unowned self", self) } component.callback = localClosureUsingUnownedSelf } } ݁Ռ͸… 47

Slide 48

Slide 48 text

ϩʔΧϧΫϩʔδϟ(தͰunowned selfΛ࢖͏) final class ViewController: UIViewController { func configureButtonAction() { let localClosureUsingUnownedSelf = { [unowned self] in print("local closure using unowned self", self) } component.callback = localClosureUsingUnownedSelf } } ݁Ռ: ݈શ! 48

Slide 49

Slide 49 text

͜͜·Ͱͷ·ͱΊ » ݈શ!ͳύλʔϯ » ϝιου([unowned self]ͳΫϩʔδϟ͔ΒݺͿ) » functionܕϓϩύςΟ » functionܕϓϩύςΟ(தͰselfΛ࢖͏) » ϩʔΧϧfunction » ϩʔΧϧΫϩʔδϟ » ϩʔΧϧΫϩʔδϟ(தͰunowned selfΛ࢖͏) » ॥؀ࢀর"͕ى͜Δύλʔϯ » ϝιουΛ௚઀౉͢ » ϩʔΧϧfunction(தͰselfΛ࢖͏) » ϩʔΧϧΫϩʔδϟ(தͰselfΛ࢖͏) 49

Slide 50

Slide 50 text

͞Βʹ·ͱΊ » Ϋϩʔδϟ͸ɺதͰ࢖ΘΕΔreference typeΛڧࢀরΩϟϓν ϟ͢Δ » unowned, weakΛ࢖͑͹ڧࢀরΩϟϓνϟ͸ආ͚ΒΕΔ » classΠϯελϯε͕࣋ͭϝιου͸ɺself΁ͷࢀরΛ࣋ͭ » classΠϯελϯε͕࣋ͭfunctionܕϓϩύςΟ͸ɺselfΛڧࢀ র͠ͳ͍ » தͰselfΛ࢖͏functionܕϓϩύςΟͰ͢ΒɺselfΛڧࢀর ͠ͳ͍ » Կނ…!? 50

Slide 51

Slide 51 text

> தͰselfΛ࢖͏functionܕϓϩύςΟͰ͢ΒɺselfΛڧ ࢀর͠ͳ͍ …ຊ౰ʹʁ 51

Slide 52

Slide 52 text

let functionTypePropertyUsingSelf = { print("function-type property using self", self) } self…? 52

Slide 53

Slide 53 text

53

Slide 54

Slide 54 text

print("function-type property using self", self) ͷ݁Ռ (Function) …ͩͱ…!? 54

Slide 55

Slide 55 text

functionܕϓϩύςΟ(தͰselfΛ࢖͏) …Λ΋͏Ұ౓Α͘Α͘ݟͯΈΔͱɺ final class ViewController: UIViewController { let functionTypePropertyUsingSelf = { print("function-type property using self", self) } } ! ͜ͷfunction͕࡞ΒΕΔ࣌ʹɺ ɹ self( ViewController )ͬͯ·ͩଘࡏͯ͠ͳ͘ͳ͍ʁ ɹ ଘࡏ͠ͳ͍΋ͷ͸ɺࢀর΋Ͱ͖ͳ͍ΑͶʁ 55

Slide 56

Slide 56 text

ͪͳΈʹɺ ͜ͷselfΛऑࢀরΩϟϓνϟ͠Α͏ͱ͢Δͱ… final class ViewController: UIViewController { let functionTypePropertyUsingSelf = { [weak self] in print("function-type property using self", self) } } ऑࢀরʹͰ͖Δͷ͸ɺ classܕɺ͋Δ͍͸classܕઐ༻ͷϓϩτίϧ͚ͩɻ self͸ ViewController ܕͷΠϯελϯεͰ͸ͳ͍ͷͰɺ ऑࢀরΩϟϓνϟ΋ෆՄೳͬͯ͜ͱͰ͢Ͷɻ 56

Slide 57

Slide 57 text

The Swift Programming Language (Swift 3): Closures ΑΓ Closure expressions are unnamed closures written in a lightweight syntax that can capture values from their surrounding context. surrounding contextͬͯͷ͸ɺͦ͏͍͏͜ͱ ʢͩͱࢥ͏ʣɻ 57

Slide 58

Slide 58 text

͞ΒʹͪͳΈʹɺ pure swiftͳclass (=NSObjectͷαϒΫϥεͰ͸ͳ͍) ͩͱ…… self͸ଘࡏࣗମɺͯ͠ͳ͍ʂ 58

Slide 59

Slide 59 text

·ͱΊʢ׬શ൛ʣ » Ϋϩʔδϟ͸ɺதͰ࢖ΘΕΔreference typeΛڧࢀ রΩϟϓνϟ͢Δ » unowned, weakΛ࢖͑͹ڧࢀরΩϟϓνϟ͸ආ ͚ΒΕΔ » classΠϯελϯε͕࣋ͭϝιου͸ɺself(classΠ ϯελϯε)΁ͷڧࢀরΛ࣋ͭɻ͠Όʔͳ͍ɻ » classΠϯελϯεͷfunctionܕϓϩύςΟͰ͸ɺͦ ΋ͦ΋self ≠ ॴ༗͍ͯ͠ΔclassΠϯελϯεࣗ਎ 59