Slide 1

Slide 1 text

Swi$ͷ struct ͱ ΠϛϡʔλϏϦςΟ @koher

Slide 2

Slide 2 text

ࣗݾ঺հ • @koher • ΤϯδχΞʢQonceptʣ • ΧϯϑΝϨϯεొஃ • try! Swi0 Tokyo: 2016 • iOSDC Japan: 2017, 2018, 2019, 2020, 2021, 2022, 2024 • Swi0 Zoomin' ओ࠵ • Heart of Swi0 ࣥච

Slide 3

Slide 3 text

࣭໰ struct Foo { var value: Int } ͜ͷ struct ͸ϛϡʔλϒϧͰ͔͢ʁΠϛϡʔλϒϧͰ͔͢ʁ

Slide 4

Slide 4 text

struct ͸ϛϡʔλϒϧͰ΋ ຊ࣭తʹ͸ΠϛϡʔλϒϧΫϥεͱಉ͡

Slide 5

Slide 5 text

var ϓϩύςΟΛ࣋ͭ struct struct Foo { var value: Int }

Slide 6

Slide 6 text

var ϓϩύςΟΛ࣋ͭ struct struct Foo { var value: Int } extension Foo { mutating func increment() { value += 1 } }

Slide 7

Slide 7 text

var ϓϩύςΟΛ࣋ͭ struct var foo: Foo = .init(value: 0) foo.increment() print(foo.value) // 1

Slide 8

Slide 8 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int }

Slide 9

Slide 9 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int } extension Foo { mutating func increment() { value += 1 // ⛔ ίϯύΠϧΤϥʔ } }

Slide 10

Slide 10 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int } extension Foo { mutating func increment() { self = Foo(value: value + 1) // ͜ΕͳΒOK } }

Slide 11

Slide 11 text

ϝιουͱ͸ // ϝιουͷ৔߹ extension Foo { // ҉໧ͷୈ1Ҿ਺ self Λ࣋ͭ func bar() -> Int { self.value * self.value } }

Slide 12

Slide 12 text

ϝιουͱ͸ // ϝιουͷ৔߹ extension Foo { // ҉໧ͷୈ1Ҿ਺ self Λ࣋ͭ func bar() -> Int { self.value * self.value } } let foo: Foo = .init(value: 3) print(foo.bar()) // 9

Slide 13

Slide 13 text

ϝιουͱ͸ // ؔ਺ͷ৔߹ // ໌ࣔతୈ1Ҿ਺ self Λ࣋ͭ func bar(_ self: Foo) -> Int { self.value * self.value } let foo: Foo = .init(value: 3) print(bar(foo)) // 9

Slide 14

Slide 14 text

mutating ͱ͸ struct Foo { var value: Int } extension Foo { mutating func increment() { self.value += 1 // ✅ } }

Slide 15

Slide 15 text

mutating ͱ͸ struct Foo { var value: Int } extension Foo { func increment() { self.value += 1 // ⛔ } }

Slide 16

Slide 16 text

mutating ͱ͸ struct Foo { var value: Int } func increment(_ self: Foo) { self.value += 1 // ⛔ }

Slide 17

Slide 17 text

mutating ͱ͸ struct Foo { var value: Int } func increment(_ self: inout Foo) { self.value += 1 // ✅ }

Slide 18

Slide 18 text

mutating ͱ͸ struct Foo { var value: Int } extension Foo { mutating func increment() { self.value += 1 // ✅ } }

Slide 19

Slide 19 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int } extension Foo { mutating func increment() { self = Foo(value: self.value + 1) // } }

Slide 20

Slide 20 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int } func increment(_ self: inout Foo) { self = Foo(value: self.value + 1) // }

Slide 21

Slide 21 text

let ϓϩύςΟΛ࣋ͭ struct struct Foo { let value: Int } extension Foo { mutating func increment() { self = Foo(value: self.value + 1) // } }

Slide 22

Slide 22 text

let ϓϩύςΟΛ࣋ͭ struct var foo: Foo = .init(value: 0) foo.increment() // ✅ Foo.value ͕ let Ͱ΋ OK print(foo.value) // 1

Slide 23

Slide 23 text

ϓϩύςΟͷએݴ͕ var ͔ let ͔͸ struct ͷϛϡʔλϏϦςΟΛܾΊͳ͍

Slide 24

Slide 24 text

ม਺ʢఆ਺ʣએݴͷ var / let ͕ struct ͷϛϡʔλϏϦςΟΛܾΊΔ

Slide 25

Slide 25 text

ม਺ʢఆ਺ʣએݴͱϛϡʔλϏϦςΟ var foo: Foo = .init(value: 0) foo.increment() // ✅ print(foo.value)

Slide 26

Slide 26 text

ม਺ʢఆ਺ʣએݴͱϛϡʔλϏϦςΟ let foo: Foo = .init(value: 0) foo.increment() // ⛔ print(foo.value)

Slide 27

Slide 27 text

஋ܕͷϛϡʔλϏϦςΟΛ ࢀরܕͱಉ͡Α͏ʹߟ͑ͯ͸͍͚ͳ͍

Slide 28

Slide 28 text

஋ܕͷΠϯελϯε͸ ม਺ͷͨΊʹ֬อ͞ΕͨϝϞϦྖҬͱҰମ

Slide 29

Slide 29 text

ΠϛϡʔλϒϧΫϥε final class Foo { let value: Int }

Slide 30

Slide 30 text

ΠϛϡʔλϒϧΫϥε final class Foo { let value: Int } extension Foo { // ⛔ ࢒೦ͳ͕Β͜Ε͸Swiftͷߏจͷ໰୊ͰͰ͖ͳ͍ mutating func increment() { self = Foo(value: self.value + 1) } }

Slide 31

Slide 31 text

ΠϛϡʔλϒϧΫϥε final class Foo { let value: Int } // ✅ ͜ΕͳΒOK func increment(_ self: inout Foo) { self = Foo(value: self.value + 1) }

Slide 32

Slide 32 text

ΠϛϡʔλϒϧΫϥε var foo: Foo = .init(value: 0) increment(&foo) // ✅ ͜ΕͳΒ foo ΛมߋՄ print(foo.value) // 1

Slide 33

Slide 33 text

struct ͱΠϛϡʔλϒϧΫϥε͸ ຊ࣭తʹಉ͜͡ͱ͕Ͱ͖Δ

Slide 34

Slide 34 text

ΠϛϡʔλϒϧΫϥε͸Πϯελϯεͷ ϝϞϦྖҬΛมߋͰ͖ͳ͍

Slide 35

Slide 35 text

ࢀরܕͰ͸ͳ͘஋ܕͷ ʢม਺ଆͷʣϛϡʔλϏϦςΟͰߟ͑Ε͹ ΠϛϡʔλϒϧΫϥε͸ struct ͱಉ͡

Slide 36

Slide 36 text

ϛϡʔλϒϧΫϥε final class Foo { var value: Int }

Slide 37

Slide 37 text

ϛϡʔλϒϧΫϥε final class Foo { var value: Int } extension Foo { func increment() { value += 1 } }

Slide 38

Slide 38 text

ϛϡʔλϒϧΫϥε let foo: Foo = .init(value: 0) foo.increment() print(foo.value) // 1

Slide 39

Slide 39 text

ϛϡʔλϒϧΫϥε let foo: Foo = .init(value: 0) foo.increment() print(foo.value) // 1

Slide 40

Slide 40 text

ϛϡʔλϒϧΫϥε let foo: Foo = .init(value: 0) let foo2 = foo foo.increment() print(foo.value) // 1

Slide 41

Slide 41 text

ϛϡʔλϒϧΫϥε let foo: Foo = .init(value: 0) let foo2 = foo foo.increment() print(foo.value) // 1 print(foo2.value) // 1

Slide 42

Slide 42 text

struct var foo: Foo = .init(value: 0) var foo2 = foo foo.increment() print(foo.value) // 1 print(foo2.value) // 0

Slide 43

Slide 43 text

ΠϛϡʔλϒϧΫϥε var foo: Foo = .init(value: 0) var foo2 = foo increment(&foo) print(foo.value) // 1 print(foo2.value) // 0

Slide 44

Slide 44 text

struct ͱΠϛϡʔλϒϧΫϥε͸ shared mutable stateΛ࣋ͨͳ͍

Slide 45

Slide 45 text

Sendable ४ڌ final class User: Sendable { // var name: String } final class User: Sendable { // let name: String } struct User: Sendable { // ✅ var name: String }

Slide 46

Slide 46 text

struct Λ࢖͑͹ϛϡʔλϒϧͰ΋ ΠϛϡʔλϒϧΫϥεಉ༷ͷརӹΛڗडՄೳ

Slide 47

Slide 47 text

·ͱΊ • struct ͸ຊ࣭తʹΠϛϡʔλϒϧΫϥεͱಉ͡ • struct Λ࢖͑͹ϛϡʔλϒϧͰ΋ΠϛϡʔλϒϧΫϥεͱಉ ͡རӹΛڗडͰ͖Δ