新しい予約語がやってくる 「Swift5のOwnershipに備える」 #tryswiftconf

2018.03.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

モバイルアプリサービス部の中安です。

セッションのレポートを書かせていただきます。

講演概要

公式ページからの引用

Swift5のOwnershipに備える by Toru Kuriyama

Ownership(所有権)は今年後半に登場予定のSwift5で追加される機能です。ABI安定化に向けても重要な機能ですが、Ownershipを使いこなすことでメモリコピーを減らすことができ、プログラムのパフォーマンスを向上させることができると期待されます。本セッションでは、昨年公開されたマニフェスト(OwnershipManifesto)に記載された内容を元に、Ownershipの概要をご紹介します。

内容

4になったのも束の間、Swiftの流れは早いものでSwift5のことも考えなくてはなりません。とはいえ、まだ先の話ですがその日はすぐにやってきそう。 今回すべてのセッションを隈なく見たわけではありませんが、Swift5についての話が出たのはこのライトニングトークだけだったかなと思います。

5で登場する新たな考え方「所有権」とはどんなものだろうと注目して見ました。

より細かいメモリ管理

概要にもあるようにパフォーマンス向上をするために設置されるという「所有権」は、具体的にはコピーと参照の管理の手法です。

以前のObjective-CのMRC時代には相当意識していたメモリ管理ですが、 ARCからSwiftに移るにつれて段々と開発者は意識をしないようになってきました(まぁ本来はしなくてはいけないんですが)。

登壇者が例に挙げたのは音声データの扱いなどは、やはり細かくメモリの管理をすることでパフォーマンスの安定につながるとのこと。 そこで「所有権」「オーナーシップ」の力が発揮されるわけです。

登壇者発表の書き方をデフォルメすると

func doSomething(start: shared CGPoint, end: shared CGPoint) {

}

こういう感じでした。新たな予約語「shared」がありますね。

CGPointは構造体なので値をコピーした状態で関数に渡されるのですが、これを付けることで参照渡しの形になるとのことです。

でもそれだとすでに「inout」という予約語があります。違いは inout はその値自体を書き換えられるが、shared は読み取り専用になるらしいです。 つまり、コピーをして消費されるメモリを節約する目的があるというわけですね。

コピー不可型

暗黙的にコピーがなされるのを避けるための構文「moveonly」という予約語の話もありました。

登壇者発表の紹介では

moveonly struct Array<Element> {

}

という書き方で、Javaの排他制御であるAtomicBooleanのようなことができるとのことでした(このへん少し曖昧です。すいません)。

所有権機能はSwiftでは選択可能

このオーナーシップがSwiftに導入されるのは、Rust言語から影響を受けたとのことです。

自分はRust言語には明るくないのですが、登壇者によるとRust言語ではオーナーシップが標準的な言語仕様であって、 学習コストが少なからずかかるという議論があるらしいですね。

Swiftではその面を考慮して、開発者がオーナーシップを使う使わないの選択ができる「オプトインな機能」になるとのことです。 なので、5になったからといって即座にオーナーシップを考慮した既存ソースの書き換えなどは必要なさそうです。

感想

Objective-CでiOSアプリ開発者を長くやっている方は、releaseとかretainとかで所有権を掴んだり離したりといった「オーナーシップ」は最初に覚えるものでした。 あのときのそれと同じかどうか、まだ今日聞いたばかりなのでまだ詳しく調べれていませんが、なにやら懐かしい響きが帰ってきたように思います(笑)。

Swiwt5もまたぼちぼちと調べだそうかなぁと。