Swift Digest
SE-0106 | Swift Evolution

Add a macOS Alias for the OSX Platform Configuration Test

Proposal
SE-0106
Authors
Erica Sadun
Review Manager
Chris Lattner
Status
Implemented (Swift 3.0)

01 何が問題だったのか

WWDC 2016 で、Apple は Mac 向けのオペレーティングシステムの名称を「OS X」から「macOS」へ改めました。しかし Swift では、プラットフォームを条件付きコンパイルで判別する #if os(...) において、Mac を表す名前が OSX のままでした。

#if os(OSX)
    // Mac 向けのコード
#endif

この OSX という名前は、Sierra 以降の正式名称である「macOS」と一致していません。一方で、単純に OSXmacOS に置き換えてしまうと、Yosemite や El Capitan など Sierra より前の環境を含めて、すでに #if os(OSX) を使って書かれた既存コードすべてに書き換えを強いることになります。Swift で Mac アプリケーションを開発している開発者にとっては、これは過大な負担です。

そのため、新名称への追従と既存コードへの影響の最小化を両立させる方法が必要でした。

02 どのように解決されるのか

#if os(OSX) を置き換えるのではなく、別名(alias)として #if os(macOS) を追加 します。これにより、既存の OSX を使ったコードはそのまま動作しつつ、新しいコードでは Apple の公式な名称である macOS を使って書けるようになります。

使い方は従来と同じで、os()macOS を渡すだけです。

#if os(macOS)
    // macOS(および OS X)向けのコード
#endif

コンパイラ側では、ターゲットが Mac のオペレーティングシステムの場合、os プラットフォーム条件として OSXmacOS の両方を成立させます。したがって、#if os(OSX)#if os(macOS) はどちらも同じ条件を表し、同じブランチが選択されます。

この変更は純粋に追加のみで、既存コードに破壊的な影響を与えることはありません。os() 以外でプラットフォーム名が現れる @available#available の属性・式については本 Proposal のスコープ外で、別途対応が検討されます(本 Proposal 時点では OSX / OSXApplicationExtension の表記が残ります)。