‫۽‬୩༑޺
!FT@LVNBHBJ
ઍࡀΏΔ͍ษ‫ڧ‬ձWPM
4XJGUͷ৽‫ػ‬ೳ
4XJGUॴ༗‫ݖ‬ཁఘ
▶︎
4XJGU‫޷͕ޠݴ‬Έ
▶︎
ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕޷Έ
▶︎
ϓϩάϥϛϯάͷָ͠͞Λ఻͍͖͍͑ͯͨ
5PNPIJSP,VNBHBJ
‫۽‬୩༑޺
4XJGUॴ༗‫ݖ‬
4XJGUͷ৽‫ػ‬ೳ
ংນ
‫ࣜג‬ձࣾΏΊΈ͞Μͷࣾ಺ษ‫ڧ‬ձͱͯ͠։࠵͍ͯ͠Δ
΍͍͞͠4XJGUษ‫ڧ‬ձʹͯʮ4XJGUॴ༗‫ݖ‬ʯΛ୊ࡐʹͨ͠ɻ
4XJGUॴ༗‫ݖ‬ɺษ‫ڧ‬ձͷ୊ࡐʹͨ͠ɻ
िճ!ΦϯϥΠϯ#一般参加も大歓迎
▶︎
ϓϩύςΟʔʹॴ༗‫͕ݖ‬ಋೖ͞Εͨ
w म০ࢠͷ௥Ճ consuming borrowing inout 
▶︎
஋ͷѻ͍ํΛࢦఆՄೳʹͳͬͨ
w ԋࢉࢠͷ௥Ճ copy consume 
▶︎
ෳ੡Ͱ͖ͳ͍஋‫͕ܕ‬ಋೖ͞Εͨ
w ઐ༻ϓϩτίϧͷ௥Ճ ~Copyable 
▶︎
্‫ʹه‬൐͏͞·͟·ͳ‫ޠݴ‬ϧʔϧͷ௥Ճ
ॴ༗‫ݖ‬ͷ৽‫ػ‬ೳ
▶︎
Ҿ਺ͷॴ༗‫ݖ‬ΛࢦఆՄೳʹ
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 {
}
▶︎
ॴ༗‫ݖ‬ʁʢ‫ݴ‬༿͕΋ͷ΋ͷ͍͠ʣ
w 3VTU‫͋ʹޠݴ‬Δ֓೦ͷ༌ೖΒ͍͠ʁ
w $ ‫ޠݴ‬ͷNPWF΍ӈล஋ࢀরͱଊ͑Ε͹ྑͦ͞͏ʁ
▶︎
CPSSPXJOH͸आ༻ͰɺDPOTVNJOH͸ফඅʁ
▶︎
ෳ੡Ͱ͖ͳ͍஋‫͑࢖͕ܕ‬ΔΑ͏ʹͳͬͨʁ
ॴ༗‫ݖ‬ͷमಘΛࢼΈΔ
Ώͬ͘Γ੔ཧ͍͚ͯ͠͹ɺͦ͜·Ͱ೉͘͠͸ͳͦ͞͏Š
ŠͱࢥͬͨͷͰ͕͢
ཧղͰ͖ͨͭ΋Γʹͳͬͯ΋ɺ
࣮ࡍʹ࢖͏ͱ෼͔Βͳ͘ͳͬͯɺ·ͨௐ΂ͯŠͷ‫܁‬Γฦ͠ɻ
ࠞཚͨ͠ɻ
࠶౓J1IPOF%FW4BQQPSPr+VOF Ͱ୊ࡐʹ࢓ཱͯͯΈͯ΋
ͦΕͰ΋·ͩ·ͩࠞཚ͸ଓ͍ͯ
⋯
ཧղΛ੔ཧ͠ͳ͓ͯ͠Έͨɻ
▶︎
ॴ༗‫ݴ͏͍ͱݖ‬༿ʹनΘΕ͕ͪ
▶︎
आ༻ͱফඅͷҙຯ͸෼͔Γ΍͍͢ͷʹ
ͦͷΠϝʔδͱҧ͏ಈ࡞Λ‫ͤݟ‬ΒΕͯ‫ށ‬࿭͏
▶︎
ෳ੡Ͱ͖ͳ͍஋‫ʹܕ‬࿭Θ͞Ε͕ͪ
w ໨‫ػۄ‬ೳͱࢥ͍͖΍Ռͯ͠ͳ͘ະ‫׬‬੒ʢδΣωϦΫεʹະରԠʣ
▶︎
௥Ճ͞Εͨ‫ޠݴ‬ϧʔϧͷमಘ͕ࠔ೉
Ͳ͕͜೉͍͠ͷͩΖ͏ɻ
4XJGUॴ༗‫ݖ‬ཁఘ
4XJGUͷ৽‫ػ‬ೳ
4XJGUॴ༗‫ݖ‬
ཁఘ
▶︎
஋Λѻ͏ͱ͖ʹෳ੡͠ͳ͍खஈ͕༻ҙ͞Εͨ
▶︎
ͦͷ؅ཧͷͨΊʹɺ஋ʹ෇Ճ৘ใ͕ఴ͑ΒΕͨˡॴ༗‫ݖ‬
஋
͜ͷ஋͸ʜ
wआ༻͍ͯ͠Δʁ
wফඅͷର৅ʁ
wͦΕͱ΋ैདྷ௨Γʹෳ੡ʁ
͜ΕΒ͕ॴ༗‫ݖ‬
˞ ෳ੡λΠϛϯάΛϓϩάϥϚʔ͕ਤΕΔ͢Δͷ͕໨త
Ҏ্
·ͱΊ
4XJGUॴ༗‫ݖ‬
·ͱΊ
ॴ༗‫ݖ‬ͷ໨త
▶︎
஋ͷෳ੡ΛઌૹΓͰ͖Δखஈͷఏ‫ڙ‬
▶︎
ෆඞཁͳෳ੡Λճආͯ͠ɺॲཧޮ཰ͷ޲্ΛਤΕΔ
˙ ෳ੡ෆՄͳ‫ܕ‬ͷͱ͖͸ʜ
var value: Value
˙ ී௨ʹఆٛͨ͠ͱ͖͸ʜ
var value: Int
·ͱΊ
ม਺ͷॴ༗‫ݖ‬
ෳ੡ෆՄͳ‫ͱܕ‬͸ʜ
~Copyableʹ४‫ܕͨ͠ڌ‬
struct Value : ~Copyable {
⋯
}
ैདྷ௨Γͷෳ੡
ର৅ ফඅͷର৅ෳ੡Ͱ͖ͳ͍
˞ ैདྷ௨Γͷ΋ͷ͸ɺैདྷ௨Γʹಈ͘ʢॏཁʣ
·ͱΊ
Ҿ਺ͷॴ༗‫ݖ‬
▶︎
Ҿ਺ͷॴ༗‫ݖ‬͸ɺؔ਺಺Ͱͷѻ͍Λ‫ٴݴ‬
▶︎
‫ݺ‬ग़‫ʹݩ‬͸௚઀ؔ༩͠ͳ͍
func exec(value: Int) {
}
func exec(value: consuming Int) {
}
func exec(value: borrowing Int) {
}
͜ͷ಺Ͱvalue͸
ैདྷ௨Γѻ͑Δ
͜ͷ಺Ͱvalue͸
आ༻தʹग़དྷΔൣғͰѻ͑Δ
͜ͷ಺Ͱvalue͸
ফඅͷର৅ͱͯ͠ѻ͑Δ
˞ ؔ਺ϒϩοΫ಺͚ͩΛߟ͑Ε͹ྑ͍
˞ ‫ݺ‬ग़‫Ͱݩ‬ͷѻ͍͸ɺ‫ݺ‬ग़‫ʹͳ͠ྑ͕ݩ‬΍ͬͯ͘ΕΔ
˙value͕ैདྷ௨Γͷѻ͍ͳΒ
⋯

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

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

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

exec(object)
ैདྷ௨Γʹड͚औΔ૬खͳΒ
ফඅ͠ͳ͍ʢࢀর౉͠ͱಉ౳ʁʣ
आ༻͍ͨ͠૬खʹ͸
ି༩͢Δʢফඅ͠ͳ͍ʣ
ফඅ͠Α͏ͱ͍ͯ͠Δ૬खʹ͸
ৡ౉ͯ͠ɺ
Ҏ߱͸ؔ༩͠ͳ͍
ಛผϧʔϧ
ॴ༗‫ͱ·ݖ‬Ί
let other = value
ಛผϧʔϧ
ӈล஋͸ফඅ
WBMVF͕ैདྷ௨Γͷ஋ͳΒ
PUIFSʹ͸஋Λෳ੡ͯ͠୅ೖʢैདྷ௨Γʣ
˞ ؔ਺ͷফඅ͠Α͏ͱ͢ΔҾ਺ʹ౉͢ͱ͖ͱɺ
΄΅ಉ͡‫ڍ‬ಈʢͨͩ͠ɺ
୅ೖ‫ʹݩ‬΋ए‫ؔׯ‬༩ʣ
WBMVF͕ফඅͷର৅ͳΒ
PUIFSʹ‫ݖ‬རΛৡ౉͠ɺ
Ҏ߱WBMVF͸࢖͑ͳ͘ͳΔ
WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ
PUIFS͸ैདྷ௨Γʹѻ͓͏ͱ͢ΔͷͰɺ
ෳ੡͠ͳ͍‫ݶ‬Γ͸౉ͤͳ͍
ಛผϧʔϧ
໭Γ஋ʹ͢Δͱফඅ
return value
WBMVF͕ैདྷ௨Γͷ஋ͳΒ
ෳ੡ͨ͠஋Λฦ٫ʢैདྷ௨Γʣ
˞ ӈล஋ͱಉ͡ϧʔϧ
WBMVF͕ফඅͷର৅ͳΒ
‫ݺ‬ग़‫ݖʹݩ‬རΛͦͷ··ৡ౉
WBMVFΛआ༻͍ͯ͠Δ͚ͩͳΒ
ͦΕΛख์͢Θ͚ʹ͸͍͔ͳ͍ͷͰɺ
ෳ੡͠ͳ͍‫ݶ‬Γ͸ฦͤͳ͍
ॴ༗‫ݖ‬ԋࢉࢠ
ॴ༗‫ͱ·ݖ‬Ί
˙ෳ੡ԋࢉࢠ
let other = copy value
ॴ༗‫ݖ‬ԋࢉࢠ
ෳ੡ԋࢉࢠͱফඅԋࢉࢠ
˙ফඅԋࢉࢠ
let other = consume value
WBMVFΛফඅѻ͍ʹ͢Δ
໭Γ஋ʹͨ͠ͷͱಉ༷ʹWBMVF͕ѻΘΕΔʢෳ੡͞ΕΔՄೳੑ΋ʣ
WBMVFΛෳ੡ѻ͍ʹ͢Δ
ैདྷ௨ΓʹWBMVF͕ෳ੡͞ΕΔ
Ṗϧʔϧ
ॴ༗‫ͱ·ݖ‬Ί
func calculate(_ value: any BinaryInteger) {
⋯
}
calculate(value)
Ṗϧʔϧ
ଘࡏ‫ʹܕ‬͸ফඅͯ͠ೖΔ
ଘࡏ‫΁ܕ‬ͷΩϟετ͕ඞཁʹͳΔͱ͖
ͦͷ஋͸ফඅ͞ΕΑ͏ͱ͢Δ
˞ ͜Ε͸ࠓ͚ͩͷ੍‫͔ݶ‬΋͠Εͳ͍
आ༻͍ͯ͠Δ஋͸ফඅͰ͖ͳ͍ͨΊɺ
ෳ੡͠ͳ͍ͱ౉ͤͳ͍
‫ݺ‬ग़ઌ͕ফඅ͠Α͏ͱͯ͠ͳͯ͘΋ɺ
ଘࡏ‫ʹ͖ͱͨͬͳʹܕ‬ফඅ͞ΕΔ
func calculate(_ value: some BinaryInteger) { ⋯ }
func something(_ value: consuming Int) {
calculate(value)
}
Ṗϧʔϧ
ෆಁ໌‫ͯ͠ͱܕ‬ফඅର৅Λ౉͢ͱ͖
WBMVF͕ফඅର৅ͷͱ͖ɺ
ෆಁ໌‫ܕ‬Λैདྷ௨Γʹड͚औΔ૬खʹ౉ͯ͠΋ɺ
ফඅ͞Εͳ͍
ʢṖʣ
˞ ҙਤͨ͠ಈ࡞ͳͷ͔͸ෆ໌
˞ ͦͷ΄͔ͷ౉͠ํ͸ɺ௨ৗͷ‫ܕ‬ͷͱ͖ͱಉ༷
OKPZ4XJGU
5IBOLZPV
‫۽‬୩༑޺
!FT@LVNBHBJ

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