Swift 所有権 要諦 #ゆるちとせ

143 Views

October 19, 23

スライド概要

2023/10/15 に "千歳ゆるい勉強会vol.3" で発表した資料を、当日に話す中で違和感を覚えたあたりを中心に見直した資料です。Swift 5.9 の新機能「所有権」で自分が混乱した体験をもとに、どこを押さえれば修得できるものなのか、そんな着目点で要所を整理してみています。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 152 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

4XJGUͷ৽‫ػ‬ೳ 4XJGUॴ༗‫ݖ‬ཁఘ ‫۽‬୩༑޺ !FT@LVNBHBJ ઍࡀΏΔ͍ษ‫ڧ‬ձWPM

2.

▶︎ ▶︎ ▶︎ ‫۽‬୩༑޺ 5PNPIJSP,VNBHBJ 4XJGU‫޷͕ޠݴ‬Έ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕޷Έ ϓϩάϥϛϯάͷָ͠͞Λ఻͍͖͍͑ͯͨ

3.

4XJGUͷ৽‫ػ‬ೳ 4XJGUॴ༗‫ݖ‬

4.

ংນ

5.

4XJGUॴ༗‫ݖ‬ɺษ‫ڧ‬ձͷ୊ࡐʹͨ͠ɻ ‫ࣜג‬ձࣾΏΊΈ͞Μͷࣾ಺ษ‫ڧ‬ձͱͯ͠։࠵͍ͯ͠Δ ΍͍͞͠4XJGUษ‫ڧ‬ձʹͯʮ4XJGUॴ༗‫ݖ‬ʯΛ୊ࡐʹͨ͠ɻ िճ!ΦϯϥΠϯ#一般参加も大歓迎

6.

▶︎ ▶︎ ▶︎ ▶︎ ॴ༗‫ݖ‬ͷ৽‫ػ‬ೳ ϓϩύςΟʔʹॴ༗‫͕ݖ‬ಋೖ͞Εͨ w म০ࢠͷ௥Ճ consuming borrowing inout  ஋ͷѻ͍ํΛࢦఆՄೳʹͳͬͨ w ԋࢉࢠͷ௥Ճ copy consume  ෳ੡Ͱ͖ͳ͍஋‫͕ܕ‬ಋೖ͞Εͨ w ઐ༻ϓϩτίϧͷ௥Ճ ~Copyable  ্‫ʹه‬൐͏͞·͟·ͳ‫ޠݴ‬ϧʔϧͷ௥Ճ

7.

▶︎ ▶︎ ▶︎ ॴ༗‫ݖ‬ͷ۩ମྫ Ҿ਺ͷॴ༗‫ݖ‬ΛࢦఆՄೳʹ func something(value: Int) func something(value: borrowing Int) func something(value: consuming Int) ஋ͷ໌ࣔෳ੡΍ফඅ͕Մೳʹ let value = copy otherValue let value = consume otherValue ෳ੡Ͱ͖ͳ͍ߏ଄ମ͕ఆٛՄೳʹ struct Value : ~Copyable { }

8.

▶︎ ▶︎ ▶︎ ॴ༗‫ݖ‬ͷमಘΛࢼΈΔ ॴ༗‫ݖ‬ʁʢ‫ݴ‬༿͕΋ͷ΋ͷ͍͠ʣ w 3VTU‫͋ʹޠݴ‬Δ֓೦ͷ༌ೖΒ͍͠ʁ w $ ‫ޠݴ‬ͷNPWF΍ӈล஋ࢀরͱଊ͑Ε͹ྑͦ͞͏ʁ CPSSPXJOH͸आ༻ͰɺDPOTVNJOH͸ফඅʁ ෳ੡Ͱ͖ͳ͍஋‫͑࢖͕ܕ‬ΔΑ͏ʹͳͬͨʁ

9.

Ώͬ͘Γ੔ཧ͍͚ͯ͠͹ɺͦ͜·Ͱ೉͘͠͸ͳͦ͞͏Š

10.

ŠͱࢥͬͨͷͰ͕͢

11.

ࠞཚͨ͠ɻ ཧղͰ͖ͨͭ΋Γʹͳͬͯ΋ɺ ࣮ࡍʹ࢖͏ͱ෼͔Βͳ͘ͳͬͯɺ·ͨௐ΂ͯŠͷ‫܁‬Γฦ͠ɻ

12.

ཧղΛ੔ཧ͠ͳ͓ͯ͠Έͨɻ ࠶౓J1IPOF%FW4BQQPSPr+VOF Ͱ୊ࡐʹ࢓ཱͯͯΈͯ΋ ⋯ ͦΕͰ΋·ͩ·ͩࠞཚ͸ଓ͍ͯ

13.

▶︎ ▶︎ ▶︎ ▶︎ Ͳ͕͜೉͍͠ͷͩΖ͏ɻ ॴ༗‫ݴ͏͍ͱݖ‬༿ʹनΘΕ͕ͪ आ༻ͱফඅͷҙຯ͸෼͔Γ΍͍͢ͷʹ ͦͷΠϝʔδͱҧ͏ಈ࡞Λ‫ͤݟ‬ΒΕͯ‫ށ‬࿭͏ ෳ੡Ͱ͖ͳ͍஋‫ʹܕ‬࿭Θ͞Ε͕ͪ w ໨‫ػۄ‬ೳͱࢥ͍͖΍Ռͯ͠ͳ͘ະ‫׬‬੒ʢδΣωϦΫεʹະରԠʣ ௥Ճ͞Εͨ‫ޠݴ‬ϧʔϧͷमಘ͕ࠔ೉

14.

4XJGUͷ৽‫ػ‬ೳ 4XJGUॴ༗‫ݖ‬ཁఘ

15.

▶︎ ▶︎ 4XJGUॴ༗‫ݖ‬ ཁఘ ஋Λѻ͏ͱ͖ʹෳ੡͠ͳ͍खஈ͕༻ҙ͞Εͨ ͦͷ؅ཧͷͨΊʹɺ஋ʹ෇Ճ৘ใ͕ఴ͑ΒΕͨˡॴ༗‫ݖ‬ ͜ͷ஋͸ʜ ஋ w आ༻͍ͯ͠Δʁ w ফඅͷର৅ʁ w ͦΕͱ΋ैདྷ௨Γʹෳ੡ʁ ͜ΕΒ͕ॴ༗‫ݖ‬ ˞ ෳ੡λΠϛϯάΛϓϩάϥϚʔ͕ਤΕΔ͢Δͷ͕໨త

16.

Ҏ্

17.

4XJGUॴ༗‫ݖ‬ ·ͱΊ

18.

▶︎ ▶︎ ·ͱΊ ॴ༗‫ݖ‬ͷ໨త ஋ͷෳ੡ΛઌૹΓͰ͖Δखஈͷఏ‫ڙ‬ ෆඞཁͳෳ੡Λճආͯ͠ɺॲཧޮ཰ͷ޲্ΛਤΕΔ

19.

·ͱΊ ม਺ͷॴ༗‫ݖ‬ ˙ ී௨ʹఆٛͨ͠ͱ͖͸ʜ ˙ ෳ੡ෆՄͳ‫ܕ‬ͷͱ͖͸ʜ var value: Int var value: Value ैདྷ௨Γͷෳ੡ର৅ ফඅͷର৅ෳ੡Ͱ͖ͳ͍ ෳ੡ෆՄͳ‫ͱܕ‬͸ʜ ~Copyableʹ४‫ܕͨ͠ڌ‬ ˞ ैདྷ௨Γͷ΋ͷ͸ɺैདྷ௨Γʹಈ͘ʢॏཁʣ struct Value : ~Copyable { ⋯ }

20.

▶︎ ▶︎ ·ͱΊ Ҿ਺ͷॴ༗‫ݖ‬ Ҿ਺ͷॴ༗‫ݖ‬͸ɺؔ਺಺Ͱͷѻ͍Λ‫ٴݴ‬ ‫ݺ‬ग़‫ʹݩ‬͸௚઀ؔ༩͠ͳ͍ func exec(value: Int) { } ͜ͷ಺Ͱvalue͸ ैདྷ௨Γѻ͑Δ func exec(value: borrowing Int) { } ͜ͷ಺Ͱvalue͸ आ༻தʹग़དྷΔൣғͰѻ͑Δ func exec(value: consuming Int) { ˞ ؔ਺ϒϩοΫ಺͚ͩΛߟ͑Ε͹ྑ͍ } ˞ ‫ݺ‬ग़‫Ͱݩ‬ͷѻ͍͸ɺ‫ݺ‬ग़‫ʹͳ͠ྑ͕ݩ‬΍ͬͯ͘ΕΔ ͜ͷ಺Ͱvalue͸ ফඅͷର৅ͱͯ͠ѻ͑Δ

21.

·ͱΊ ෳ੡ର৅Λ౉͢ ˙ value͕ैདྷ௨Γͷѻ͍ͳΒ  exec(value) ‫ݺ‬ग़ઌͷ‫ٻ‬ΊʹґΒͣɺ ैདྷ௨Γʹ஋Λ౉͢ ⋯ ˞ ैདྷ௨Γͷ΋ͷ͸ɺैདྷ௨Γʹಈ͘ʢॏཁʣ func exec(_: Int) func exec(_: consuming Int) func exec(_: borrowing Int)

22.

·ͱΊ आ༻͍ͯ͠Δର৅Λ౉͢ ˙ valueΛआ༻͍ͯ͠ΔͳΒ  exec(value) func exec(_: Int) func exec(_: borrowing Int) ͨͩ͠ɺফඅ͠Α͏ͱ͢Δ૬खʹ͸ ౉͞ͳ͍ʢआΓ΋ͷΛյ͞Εͯ͸ࠔΔʣ func exec(_: consuming Int) ⋯ आΓ΋ͷΛຢିͯ͠͠ ࣗ༝ʹѻͬͯ΋Β͏ʢӾཡɾෳ੡ɾ࠶ି༩ʣ

23.

·ͱΊ ফඅର৅Λ౉͢ ˙ ஋‫ܕ‬ͷফඅର৅ͳ஋ͳΒ  ˙ ࢀর‫ܕ‬ͷফඅର৅ͳ஋ͳΒ exec(value) exec(object) आ༻͍ͨ͠૬खʹ͸ ି༩͢Δʢফඅ͠ͳ͍ʣ ফඅ͠Α͏ͱ͍ͯ͠Δ૬खʹ͸ ৡ౉ͯ͠ɺҎ߱͸ؔ༩͠ͳ͍ ⋯ ⋯ ैདྷ௨Γʹड͚औΔ૬खʹ͸ ৡ౉ͯ͠ɺҎ߱͸ؔ༩͠ͳ͍  func exec(_: borrowing Int) func exec(_: consuming Int) ैདྷ௨Γʹड͚औΔ૬खͳΒ ফඅ͠ͳ͍ʢࢀর౉͠ͱಉ౳ʁʣ func exec(_: Int)

24.

ॴ༗‫ͱ·ݖ‬Ί ಛผϧʔϧ

25.

ಛผϧʔϧ ӈล஋͸ফඅ let other = value WBMVF͕ैདྷ௨Γͷ஋ͳΒ PUIFSʹ͸஋Λෳ੡ͯ͠୅ೖʢैདྷ௨Γʣ WBMVF͕ফඅͷର৅ͳΒ PUIFSʹ‫ݖ‬རΛৡ౉͠ɺҎ߱WBMVF͸࢖͑ͳ͘ͳΔ WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ PUIFS͸ैདྷ௨Γʹѻ͓͏ͱ͢ΔͷͰɺෳ੡͠ͳ͍‫ݶ‬Γ͸౉ͤͳ͍ ˞ ؔ਺ͷফඅ͠Α͏ͱ͢ΔҾ਺ʹ౉͢ͱ͖ͱɺ΄΅ಉ͡‫ڍ‬ಈʢͨͩ͠ɺ୅ೖ‫ʹݩ‬΋ए‫ؔׯ‬༩ʣ

26.

ಛผϧʔϧ ໭Γ஋ʹ͢Δͱফඅ return value WBMVF͕ैདྷ௨Γͷ஋ͳΒ ෳ੡ͨ͠஋Λฦ٫ʢैདྷ௨Γʣ WBMVF͕ফඅͷର৅ͳΒ ‫ݺ‬ग़‫ݖʹݩ‬རΛͦͷ··ৡ౉ WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ ͦΕΛख์͢Θ͚ʹ͸͍͔ͳ͍ͷͰɺෳ੡͠ͳ͍‫ݶ‬Γ͸ฦͤͳ͍ ˞ ӈล஋ͱಉ͡ϧʔϧ

27.

ॴ༗‫ͱ·ݖ‬Ί ॴ༗‫ݖ‬ԋࢉࢠ

28.

ॴ༗‫ݖ‬ԋࢉࢠ ෳ੡ԋࢉࢠͱফඅԋࢉࢠ ˙ ෳ੡ԋࢉࢠ let other = copy value WBMVFΛෳ੡ѻ͍ʹ͢Δ ैདྷ௨ΓʹWBMVF͕ෳ੡͞ΕΔ ˙ ফඅԋࢉࢠ let other = consume value WBMVFΛফඅѻ͍ʹ͢Δ ໭Γ஋ʹͨ͠ͷͱಉ༷ʹWBMVF͕ѻΘΕΔʢෳ੡͞ΕΔՄೳੑ΋ʣ

29.

ॴ༗‫ͱ·ݖ‬Ί Ṗϧʔϧ

30.

Ṗϧʔϧ ଘࡏ‫ʹܕ‬͸ফඅͯ͠ೖΔ func calculate(_ value: any BinaryInteger) { ⋯ } calculate(value) ଘࡏ‫΁ܕ‬ͷΩϟετ͕ඞཁʹͳΔͱ͖ ͦͷ஋͸ফඅ͞ΕΑ͏ͱ͢Δ आ༻͍ͯ͠Δ஋͸ফඅͰ͖ͳ͍ͨΊɺෳ੡͠ͳ͍ͱ౉ͤͳ͍ ‫ݺ‬ग़ઌ͕ফඅ͠Α͏ͱͯ͠ͳͯ͘΋ɺଘࡏ‫ʹ͖ͱͨͬͳʹܕ‬ফඅ͞ΕΔ ˞ ͜Ε͸ࠓ͚ͩͷ੍‫͔ݶ‬΋͠Εͳ͍

31.

Ṗϧʔϧ ෆಁ໌‫ͯ͠ͱܕ‬ফඅର৅Λ౉͢ͱ͖ func calculate(_ value: some BinaryInteger) { ⋯ } func something(_ value: consuming Int) { calculate(value) } WBMVF͕ফඅର৅ͷͱ͖ɺ ෆಁ໌‫ܕ‬Λैདྷ௨Γʹड͚औΔ૬खʹ౉ͯ͠΋ɺফඅ͞Εͳ͍ʢṖʣ ˞ ҙਤͨ͠ಈ࡞ͳͷ͔͸ෆ໌ ˞ ͦͷ΄͔ͷ౉͠ํ͸ɺ௨ৗͷ‫ܕ‬ͷͱ͖ͱಉ༷

32.

&OKPZ4XJGU 5IBOLZPV ‫۽‬୩༑޺ !FT@LVNBHBJ