Swift 所有権 — THE SECOND SEASON — #ゆるちとせ

>100 Views

October 26, 25

スライド概要

2025年10月26日に公立千歳科学技術大学、稜輝祭の催しとして開催された「千歳ゆるい勉強会 vol.6」で発表してきた資料です。

Swift 所有権については以前にも発表したのですけれど、何かと混乱しがちだったので、新たに学んだ Rust 言語の所有権の知識を踏まえつつ、2年越しに改めて Swift 所有権まわりについてを整理してみることにしました。

profile-image

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

シェア

またはPlayer版

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

ダウンロード

関連スライド

各ページのテキスト
1.

Swift 所有権 THE SECOND SEASON 熊谷友宏 @es̲kumagai 2025/10/26 千歳ゆるい勉強会 vol.6

2.

▶︎ ▶︎ ▶︎ 熊谷 友宏 Tomohiro Kumagai Swift 言語が好み みんなで楽しむ勉強会が好み プログラミングの楽しさを伝えていきたい

3.

近況 & 活動

4.

近況 & 活動 同人誌即売会 おもしろ同人誌バザール@神保町 2025/11/02 @ 東京・ベルサール神保町 技術書典 19 2025/11/16 @ 東京・池袋サンシャインシティ コミックマーケット 107(未確定) 2025/12/31 @ 東京・ビッグサイト AIR旅チケット2 in セントレア 2026/03/07 @ 愛知・中部国際空港

5.

序幕

6.

かつて Swift 所有権、勉強会の題材にした。 • 株式会社ゆめみさんの、やさしい Swift 勉強会 • 千歳ゆるい勉強会 vol.3 (2023/10/04 第305回など) (2023/10/15)

7.

▶︎ ▶︎ ▶︎ ▶︎ Swift 所有権 Swift 5.9 からの新機能(現在は Swift 6.2) プロパティーに 所有権 が導入された • 修飾子の追加 (consuming, borrowing, inout) 値の扱い方 を指定可能になった • 演算子の追加 (copy, consume) 複製できない値型 が導入された • 専用プロトコルの追加 (~Copyable) 上記に伴う さまざまな言語ルール の追加

8.

そして、混乱した。 理解できたつもりになっても、 実際に使うと分からなくなって、また調べて の繰り返し。

9.

Swift の所有権は Rust の考え方を導入したものと聞く それなら Rust の基本を、少しばかり学んでみようか Rust • The Programming Language 日本語版

10.

理解できた、気がする

11.

▶︎ ▶︎ Swift 所有権 Swiftでの、これまでの理解 値の複製を先送りできる手段の提供 不必要な複製を回避して、処理効率の向上を図れる 呼出元 copy 呼出先 値 値 consume 値 複製 借用 消費 値 値 値 borrowing consuming

12.

▶︎ Swift 所有権 Rustでの、所有権の本質 ヒープ領域を解放する責任者を定める ヒープ領域 スタック領域 値 値 参照 値 参照 値 値 参照 値 値 値 値 値

13.

Swift 所有権 Swiftの値型と参照型 値型(複製) 構造体 列挙型 タプル型 参照型(参照) 値 値 値 存在型 不透明型 オプショナル型 クラス 参照 アクター 参照 関数型 参照

14.

Swift 所有権 Swiftの値と参照 値型(複製) 構造体 参照型(参照) 参照 クラス 値 列挙型 参照 参照 存在型 値 タプル型 参照 値 参照 不透明型 値 参照 オプショナル型 値 参照 アクター 参照 関数型 参照

15.

▶︎ ▶︎ ▶︎ ▶︎ ▶︎ Swift 所有権 Rustでの印象、Swift での印象 Swift 原則として、値型は複製で、参照型は参照カウントで管理 所有権は、原則を保ちながら追加導入された機能 複製や参照カウント管理のタイミングを指示して 開発者による精密なパフォーマンス制御を可能とする Rust 所有権は、メモリー管理の根幹として存在 所有者を唯一にし、複製タイミングの明示を強要することで コンパイラーによる確実なメモリー管理と高パフォーマンスを提供

16.

Swift 所有権 THE SECOND SEASON

17.

▶︎ ▶︎ ▶︎ Swift 所有権 目的 従前からの inout で変更の権利を一時的に移せたのに加えて、 新たに borrowing の "借用" と consuming の "消費" を導入 従来からある複製の原則を抑制して、 関数呼出のときの複製処理や参照カウント増減処理を削減 明示的な所有権操作ができるようにする • 従来の既定操作と区別するためにキーワードを使う

18.

▶︎ ▶︎ ▶︎ Swift 所有権 操作 入出力 inout インスタンスの変更権利を、呼出先に一時的に移す 原則は Copy-in Copy-out(複製を渡し、複製を書き戻す) 最適化により、複製を省いて参照を直接操作したりする • • • 借用 borrow インスタンスを複製せずに、呼出先でそのまま使う • • 呼出元はインスタンスの生存を保証、呼出先は不変性を保証 消費 consume • インスタンスを複製せずに、全権を呼出先に移転する 呼出元はインスタンスを手放し、呼出先にすべての管理を一任 •

19.

▶︎ ▶︎ Swift 所有権 指定方法 引数に指定して、その引数の取り扱いを決定 メソッドに指定して、その所有者 (self) の取り扱いを決定 func exec(value: Int) func exec(value: inout Int) func exec(value: borrowing Int) func exec(value: consuming Int) func exec(value: Int) mutating func exec(value: Int) borrowing func exec(value: Int) consuming func exec(value: Int)

20.

▶︎ ▶︎ Swift 所有権 複製のルール 普通に渡されたインスタンスは、暗黙的に複製(従来通り) 借用や消費で渡されたインスタンスは、明示的な複製が必要 • 最適化により複製されないこともある • 明示的な複製は copy 演算子で行う

21.

▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ Swift 所有権 複製できない型の導入 構造体と列挙型は、複製不可の型にできる(複製可の性質を抑制) これを「Move Only 型」とも呼ぶ クラスにみる共有所有権とは異なり、常に一意の所有権を持つ これまでの標準的な型とは異なり、複製できない ヒープ割り当てと参照カウント管理に係る処理負荷を削減 所有者が唯一で明確になり、デイニシャライズが可能となる 一意のリソース管理に向く

22.

▶︎ ▶︎ Swiftの所有権 従来からの型(複製できる型) 暗黙的に同等なものが複製される 複製を必要としないタイミングを明示するのが、所有権 複製できない型 所有権が示すとおりに受け渡しをする必要がある Rust の所有権とかなり近しい性格を見せる(と思われる)

23.

▶︎ ▶︎ Swift 所有権 複製不可の表現 構造体や列挙型に ~Copyable プロトコルを適用する • 以降に渡って複製不可に制限するのではなく、 それまでの要件を複製不可に抑制する 型パラメーターを ~Copyable で制限して、複製不可な値を想定 • 標準の複製可能な性質を必須とする要件を抑制し、 複製可能な型に限らず、複製不可な型も渡せるようにする struct NonCopyableValue: ~Copyable func doSomething<T>(takingAnyNonCopyableValue: T) where T: ~Copyable

24.

▶︎ ▶︎ Swift 所有権 複製不可な型の表現 値型は、複製不可な型を持つなら自身も複製不可 参照型は、複製可能な型を持てる(参照先は唯一で複製されない) struct NonCopyableContainer: ~Copyable { var value: NonCopyableValue } class Container { var value: NonCopyableValue }

25.

▶︎ Swift 所有権 複製不可なオプショナル型 オプショナル型は、複製不可な型を扱うとき、 自身も複製不可として扱える var value: NonCopyableValue? doSomething(takingAnyNonCopyableValue: value)

26.

Swift 所有権 複製可能の表現 ▶︎ ▶︎ Copyable • 複製可能な型を示すプロトコル • これまでの型すべてを表現 参照型なら参照を複製、値型なら実質的に複製されること BitwiseCopyable • ビットレベルで複製可能な値型を示すプロトコル(参照型は不可) • すべての構成要素が BitwiseCopyable の必要がある • 最適化を容易にする(単純なビット操作での一括複製が可能)

27.

▶︎ ▶︎ Swift 所有権 Any 型の解釈変更 これまでは「すべての型」が対象だった • これからは「すべての Copyable に準拠した型」が対象に こらからの「すべての型」は ~Copyable に準拠した型 // 複製可能な型の全てが対象 var value: Any var value: any Copyable // 複製可能も不可能も含めた全ての型が対象 var value: any ~Copyable

28.

▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ ▶︎ Swift 所有権 変遷 Swift 5.9 所有権 borrowing と consuming の導入 複製演算子 copy と消費演算子 consume の導入 複製不可な ~Copyable プロトコルの導入 Swift 6.0 複製可能を示す Copyable プロトコルの導入 ビット単位の効率的な複製特性 BitwiseCopyable の導入 総称プログラミングでの複製可否での制約が可能に 複製不可な型に、複製を想定しないプロトコルの適合が可能に any 表現の解釈を見直し 所有権を想定した switch 操作の導入 複製不可な型の部分消費を可能に(デイニシャライズの効率化) Optional, Result が、複製不可な値を扱う可能性を想定 ExpressibleByNilLiteral が複製不可な型であれば適用可能に UnsafePointer が、複製不可の型を指すことも想定

29.

▶︎ ▶︎ ▶︎ ▶︎ Swift 所有権 制限事項 Swift 5.9 6.2 複製できない値型はジェネリクスで扱えない 複製できない値型は Sendable 以外のプロトコルに準拠できない 存在型にキャストしようとすると消費される • 借用している値を print の引数に渡すには copy が必要 標準ライブラリーが提供する機能が、 複製できない型を想定しきれていない(今後の課題)

30.

Swift 所有権 まとめ

31.

▶︎ ▶︎ Swift 所有権 まとめ Any が any Copyable を表すように、 従前より Swift は Copyable を前提に世界が築かれていた そこに新たに any ~Copyable の世界観が登場した ̶ 従来の世界観では、複製タイミングの制御手段として ̶ ̶ 新しい世界観では、唯一の所有者を決める手段として ̶

32.

▶︎ ▶︎ Swift 所有権 まとめ ̶ 従来の世界観では、複製タイミングの制御手段として ̶ ̶ 新しい世界観では、唯一の所有者を決める手段として ̶ 旧世界の秩序を保ちながら、 既存の型を含めたすべての型に「複製しないで扱う手段」を導入 Rust のような効率と安全性の徹底ではなく、 パフォーマンス向上のために提供された選択肢

33.

▶︎ Enjoy! Swift Thank you Any が any Copyable を表すように 熊谷友宏 @es̲kumagai