Slide 1

Slide 1 text

Re: ΤϥʔͱܯࠂͰ ίʔυΛσβΠϯ͢Δ 2017/3/22 ezura

Slide 2

Slide 2 text

ςετ ։ൃମ੍ɾ؀ڥ ઃܭࢥ૝ɾཧ࿦ ݴޠʹΑΔ
 αϙʔτ j j j j ϜϲεϮϥ΀ᩆ౰ᕥ

Slide 3

Slide 3 text

https://speakerdeck.com/ezura/eratojing-gao-de-kodowodezainsuru-chi- tohuang-falselun-wu-qu ΤϥʔͱܯࠂͰίʔυΛσβΠϯ͢Δ NFUIPE΀Ṻ΅ᲇͩᘡᔀ͞ᩆ͖ͩͥͺΤ
 θϸϖΩϰᙉͽݕᒕͫΝ

Slide 4

Slide 4 text

લఏ struct Object { var name: String var something: Any func common() { /* do something */ } func method1() { /* do something */ } func method2() { /* do something */ } }

Slide 5

Slide 5 text

method1 Λ࣮ߦ͔ͯ͠ΒͷΈ
 method2 Λ࣮ߦՄೳ (ҧ൓ΛίϯύΠϧ࣌ʹݕ஌) Mission1 // OK object.method1().method2() // Error object.method2()

Slide 6

Slide 6 text

method1, method2 Λ࣮ߦޙͷ
 ΠϯελϯεͷΈҾ਺ͱͯ͠ड͚औΔؔ਺ (ҧ൓ΛίϯύΠϧ࣌ʹݕ஌) Mission2 // OK accept(object.method1().method2()) // Error accept(object.method2())

Slide 7

Slide 7 text

࣮૷

Slide 8

Slide 8 text

࣮૷ͷ֓೦ਤ instance Init state instance State1 instance State2 func method1 func method2

Slide 9

Slide 9 text

struct Object { var name: String var something: Any func common() { /* do something */ } }

Slide 10

Slide 10 text

extension Object where State: Init { func method1() -> Object { /* do something */ } } extension Object where State: State1 { func method2() -> Object { /* do something */ } } func accept(_ object: Object) { /* do something */ }

Slide 11

Slide 11 text

࣮૷ͷ֓೦ਤ instance Init state instance State1 instance State2 func method1 func method2 Object Object Object

Slide 12

Slide 12 text

ཧ࿦͸Θ͔ͬͨʂ ࣮૷ʹམͱ͠ࠐΜͰΈΑ͏

Slide 13

Slide 13 text

extension Object where State: Init { func method1() -> Object { let object = Object(…) // Object ͷϓϩύςΟΛҾ͖ܧ͗ return object } }

Slide 14

Slide 14 text

ܕύϥϝʔλ͕ҧ͏Πϯελϯε
 (= ҟͳΔܕ)
 ͷؒͰͲ͏΍ͬͯσʔλΛҾ͖ܧ͝͏…

Slide 15

Slide 15 text

Object ͔Β Object ΁
 σʔλΛҾ͖ܧ͙ʹ͸ʁʁ new.name = self.name new.something = self.something struct Container { var name: String var something: Any }

Slide 16

Slide 16 text

ΩϟετͰ͖ΔΑʂ ۽୩͞Μ

Slide 17

Slide 17 text

Object ͔Β Object ΁ extension Object where State: Init { func method1() -> Object { let object = unsafeBitCast(self, to: Object.self) // do something return object } } Object ͔Β Object ΁ Cast

Slide 18

Slide 18 text

࣮૷Ͱ͖ͨʂ ࢖͍উख͸Ͳ͏͔ͳʁʁ

Slide 19

Slide 19 text

let object = Object(name: "sample", something: "something") ͷ໌͕ࣔඞཁ…
 (´ɾωɾʆ)

Slide 20

Slide 20 text

ίϯύΠϥʹ఻͑ͯΈΑ͏

Slide 21

Slide 21 text

extension Object where State: Init { init(name: String, something: Any) { self.name = name self.something = something } } State ͕ Init ͷͱ͖ͷΈ
 ίϯετϥΫλΛએݴ

Slide 22

Slide 22 text

let object = Object(name: "sample", something: "something") ͷ໌͕ࣔෆཁ ஫: ͜Ε͕ՄೳͱͳΔ৚͕݅͋Γ·ׂ͕͢Ѫ͠·͢
 (৚͕݅ἧ͍ͬͯͳ͍৔߹ɺίϯύΠϧΤϥʔ)

Slide 23

Slide 23 text

ͱͬͯ΋៉ྷʹͳΓ·ͨ͠ʂʂ
 ٩( 'ω' )و

Slide 24

Slide 24 text

https://gist.github.com/ezura/ e71db2b0471285061f9700809f92f2b1 ίʔυ

Slide 25

Slide 25 text

ࢀর • ۽୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ಺͔Βௌ͑ͯ͘͜ Δ੠ʹࣖΛ܏ָ͚ͯ͠ΉϥδΦ #9, #14
 http://mookmookradio.com/a0005/ • where Ͱͷܕਪ࿦ͷఏএऀͷํͷ gist
 https://gist.github.com/tarunon/ d7071689ab55e29bd367a44833687aa3 • ΤϥʔͱܯࠂͰίʔυΛσβΠϯ͢Δ
 https://speakerdeck.com/ezura/eratojing-gao-de- kodowodezainsuru-chi-tohuang-falselun-wu-qu