Swift

パワフルなプログラミング言語でありながら、簡単に習得することができます。

Swiftは、macOS、iOS、watchOS、tvOSのためのパワフルかつ使いやすいプログラミング言語です。Swiftのコーディングはインタラクティブで楽しく、構文はシンプルでいて表現力に富んでいます。さらに、デベロッパが求める最新の機能も用意されています。安全性を重視しつつ非常に軽快に動作するソフトウェアを作り出すことができます。それがSwiftです。

    Swift 5の導入

    Swift 5では、Appの配信が劇的に改善されます。SwiftランタイムがiOS、macOS、tvOS、watchOSに組み込まれるようになったため、最新のOSリリースではランタイムライブラリをAppにバンドルする必要がなくなります。Swiftで作成したAppをユーザーがApp Storeからダウンロードすると、従来よりも小さいサイズのAppがより速くダウンロードされます。

    その他の機能

    • String型がUTF-8エンコーディングで再実装されたため、より高速なコードの実行が期待できます。
    • デバッグ用ビルドとリリース用ビルドの両方で、メモリへの排他アクセスがデフォルトで必須になりました。
    • SIMD VectorおよびResult型が標準ライブラリに追加されました。
    • DictionaryとSetのパフォーマンスが改善されました。
    • 動的に呼び出し可能な型をサポートするようになり、Python、JavaScript、Rubyといった動的言語との相互運用性が強化されました。

    モダン

    Swiftは、プログラミング言語に対する最新の調査結果と、数十年にわたるAppleプラットフォームの構築経験を活かして生み出されました。名前付きパラメータは分かりやすい構文で表現され、SwiftのAPIを一段と読みやすく、メンテナンスしやすいものにしています。セミコロンを入力する必要すらありません。型推測も行われるため、コードの記述が明快で、誤りの発生が低減されます。モジュールからはヘッダが排除され、ネームスペースが利用できます。世界中の言語や絵文字を最適にサポートするため、String型にはUnicode補正とUTF-8ベースのエンコーディングが実装されており、多種多様なユースケースでもパフォーマンスが最適化されています。メモリは、厳密かつ決定性をもって動作する参照カウントを使用して自動的に管理されるため、ガベージコレクションのオーバーヘッドを回避して、メモリ使用量を最小限に抑えることができます。

    struct Player {
        var name: String
        var highScore: Int = 0
        var history: [Int] = []
    
        init(_ name: String) {
            self.name = name
        }
    }
    
    var player = Player("Tomas")

    新しい型をモダンかつ明快な構文で宣言します。インスタンスプロパティにデフォルトの値を指定し、カスタムイニシャライザを定義します。

    extension Player {
        mutating func updateScore(_ newScore: Int) {
            history.append(newScore)
            if highScore < newScore {
                print("\(newScore)! A new high score for \(name)! 🎉")
                highScore = newScore
            }
        }
    }
    
    player.updateScore(50)
    // Prints "50! A new high score for Tomas! 🎉"
    // player.highScore == 50

    Extensionを使って既存の型に機能を追加し、カスタム文字列の補間処理を用いて省略不能なお決まりの構文の出現頻度を低減します。

    extension Player: Codable, Equatable {}
    
    import Foundation
    let encoder = JSONEncoder()
    try encoder.encode(player)
    
    print(player)
    // Prints "Tomas, games played: 1, high score: 50”

    カスタム型を簡単に拡張し、JSONの自動エンコーディングやデコーディングなど、パワフルな言語の機能を利用することができます。

    let players = getPlayers()
    
    // Sort players, with best high scores first
    let ranked = players.sorted(by: { player1, player2 in
        player1.highScore > player2.highScore
    })
    
    // Create an array with only the players’ names
    let rankedNames = ranked.map { $0.name }
    // ["Erin", "Rosana", "Tomas"]

    効率的なクロージャを使って、パワフルなカスタム変換を実行できます。

    こうした先進的なコンセプトによって、簡単かつ楽しく使える言語になっています。

    Swiftには、より表現力豊かなコードを書くための機能がほかにもたくさんあります。

    • パワフルかつ使いやすいジェネリクス
    • Protocol Extensionでジェネリックコードな記述がより簡単に
    • 優れた関数と軽量なクロージャ構文
    • 範囲型またはコレクションに対する高速かつ簡潔な反復処理
    • タプルと複数の戻り値
    • メソッド、エクステンション、プロトコルに対応した構造体
    • 列挙型はペイロードとパターンマッチングに対応
    • 関数型のプログラミングパターン(マップやフィルタなど)
    • try / catch / throwを使用したネイティブなエラー処理

    安全性を重視したデザイン

    Swiftでは安全でないコードをすべて排除しています。変数は使用前に必ず初期化され、配列と整数にはオーバーフローのチェックが行われ、メモリは自動で管理されます。また、メモリに対する強制的な排他アクセスにより、プログラミング上のエラーから保護されます。構文も、意図した通りの定義を簡単に行うことができるよう調整されました。たとえば、シンプルな3文字のキーワードで変数(var)と定数(let)を定義することができます。さらに、Swiftは値型(特に一般的に使われるArray型やDictionary型など)をしっかりと活かすことで、特定の型が指定されているオブジェクトをコピーしても、別の場所で改変されることはありません。

    また、安全性を確保するため、Swiftではデフォルトでオブジェクトをnilにすることができません。実際、Swiftコンパイラは、nilのオブジェクトを作成したり使用したりしようとするとコンパイルタイムエラーとなり、これらの処理が停止する仕様になっています。これにより、コードの記述がより明快かつ安全になり、App内でランタイムクラッシュが大量に発生することを防止できます。とはいえ、正当かつ適切な目的でnilが用いられる場合もあります。そのような状況のため、SwiftはOptional型という革新的な機能を備えています。Optional型はnilを含めることもできますが、その場合デベロッパには、?構文を使用して、この型の動作に対する理解と安全に取り扱うことをコンパイラに示すことが求められます。

    extension Collection where Element == Player {
        // Returns the highest score of all the players,
        // or `nil` if the collection is empty.
        func highestScoringPlayer() -> Player? {
            return self.max(by: { $0.highScore < $1.highScore })
        }
    }

    Optional型は、関数から戻るインスタンスがある場合とない場合の両方の可能性をサポートするために使用します。

    if let bestPlayer = players.highestScoringPlayer() {
        recordHolder = """
            The record holder is \(bestPlayer.name),\
            with a high score of \(bestPlayer.highScore)!
            """
    } else {
        recordHolder = "No games have been played yet.")
    }
    print(recordHolder)
    // The record holder is Erin, with a high score of 271!
    
    let highestScore = players.highestScoringPlayer()?.highScore ?? 0
    // highestScore == 271

    安全かつ効率的にOptional値を扱えるようにするため、Optionalバインディング、Optionalチェーン、nil併合といった機能も用意されています。

    高速でパワフル

    Swiftは最初のコンセプトから、高速性を目指して構築されました。驚くほどハイパフォーマンスなLLVMコンパイラテクノロジーを使用することで、Swiftのコードが最適化されたネイティブコードへと変換されるため、最新のハードウェアの性能を存分に引き出すことができます。構文や標準ライブラリにも調整が加えられ、最も直感的な方法でコードを記述できるようになっただけでなく、手首に着けたWatchからサーバ群に至るまで、最高のパフォーマンスが得られるようになりました。

    Swiftは、CおよびObjective-Cの後継となる言語であり、型、フロー制御、演算子といったローレベルのプリミティブが含まれています。また、クラス、プロトコル、ジェネリクスのようなオブジェクト指向の機能も利用できるため、CocoaやCocoa Touchのデベロッパが求めるパフォーマンスやパワーを得ることもできます。

    初めての言語として最適

    Swiftは、コーディングの世界への扉を開きます。Swiftは、学生であっても新しいキャリアパスを模索している人でも、すべての人が初めてのプログラム言語として触れることができるようにデザインされています。Appleは、教育者の方々のために教室内外でSwiftを教えることのできる無料のカリキュラムを設けています。コーディング初心者はiPad用App、Swift PlaygroundsをダウンロードしてSwiftでのコーディングをインタラクティブかつ楽しみながら学べます。

    関心があれば、Appデベロッパは誰でも無料のコースにアクセスして、XcodeでのAppの開発について学ぶことができます。また、世界各地のApple Storeでは、Today at Appleの「コーディング&アプリケーション」セッションが開催されており、Swiftコードに実際に触れてみることができます。

    Appleが提供しているSwiftの教育リソースについてさらに詳しく

    ソースとバイナリの互換性

    Swift 5では、新バージョンのコンパイラを使用するためにSwift 4のコードを調整する必要はまったくありません。新しいコンパイラを使用すれば、Swift 5の新機能を活用しながら一度に1モジュールずつ、自分のペースで移行を進めることができます。またSwift 5では、Appのバイナリ互換が導入されました。これにより、現行および今後のOSをターゲットにしたリリースで、AppにSwiftライブラリを組み込む必要がなくなります。Swiftライブラリは、今後すべてのOSリリースに組み込まれることになります。今後、AppはOSの最新バージョンのライブラリを使用し、コードも再コンパイルすることなく引き続き実行されます。これにより、Appの開発が簡単になっただけでなく、Appのサイズの縮小や起動時間の短縮にもつながります。

    オープンソース

    Swift.orgでオープンソースとして開発されているSwiftは、ソースコード、バグトラッカー、フォーラム、定期的に提供される開発用ビルドを誰でも利用することができます。Apple内部だけではなく、多くの外部の開発者も含めた幅広いデベロッパのコミュニティが、協力してSwiftをさらに優れたものにしています。また、コミュニティ内のデベロッパは、さまざまなブログ、Podcast、カンファレンス、ミートアップを通じて、Swiftの優れた可能性を引き出すために自身の経験を発信しています。

    クロスプラットフォーム

    SwiftはすでにAppleの全プラットフォームとLinuxに対応していますが、コミュニティのメンバーがさらに多くのプラットフォームへの移植を精力的に進めています。また、SourceKit-LSPを活用して、Swiftのサポートをさまざまなデベロッパツールに統合させる取り組みもコミュニティによって進められています。より安全かつ軽快に動作するソフトウェアを開発し、プログラミングをいっそう楽しいものにする上で、Swiftにはさらに多くの可能性があります。

    サーバ向けのSwift

    Swiftは、Appleプラットフォームの数多くの最新Appで使用されていますが、最先端クラスのサーバアプリケーションにも使用されています。安全なランタイムやコンパイルされたパフォーマンス、メモリフットプリントを最小限に抑えることが求められるサーバAppにとって、Swiftは最適な言語です。Swiftを利用したサーバアプリケーションの開発と導入に向け、コミュニティによってSwift Serverワークグループが立ち上げられました。この取り組みによる最初の製品はSwiftNIOでした。このクロスプラットフォームは、高性能なプロトコルサーバとクライアント向けに開発された、非同期のイベント駆動型ネットワークアプリケーションフレームワークです。この取り組みは、ログ、指標、データベースドライバなど、現在も開発中のサーバ向けツールやテクノロジーを引き続き進めていく上での礎となっています。

    オープンソースのSwiftコミュニティおよびSwift Serverワークグループについて詳しくは、Swift.org(英語)にアクセスしてください。

    PlaygroundとRead-Eval-Print-Loop(REPL)

    iPad用Swift Playgroundsと同様、XcodeのPlaygroundでも、Swiftのコードを驚くほどシンプルかつ楽しく記述することができます。コードを1行記述すればすぐに結果に反映されます。結果はクイックルック機能でコードの横に表示でき、コードのすぐ下にピン留めすることもできます。結果のビューにはグラフィック、結果のリスト、値の時系列グラフを表示させることができます。タイムラインアシスタントを開くと、複雑なビューが展開してアニメーション表示される様子を見ることができます。新しいUIコードを試したり、コーディングしながらSpriteKitのシーンをアニメーション再生したりするときに効果的です。Playgroundでコードが完成したら、あとはそのコードをプロジェクトに移すだけです。ターミナルまたはXcodeのLLDBデバッグコンソールでも、Swiftをインタラクティブに使うことができます。Swiftの構文を使用して実行中のAppを評価したり操作したりすることができます。また、スクリプトのような環境で新しいコードを記述して動作を試すことも可能です。

    Package Manager

    Swift Package Managerは、Swiftライブラリや実行形式ファイルのビルド、実行、テスト、パッケージ化を行う、単一のクロスプラットフォームツールです。Swiftパッケージは、ライブラリやソースコードをSwiftコミュニティに配信する際の最適な方法です。パッケージの構成はSwiftで記述されているため、ターゲットの構成、製品の宣言、パッケージの依存性の管理を簡単に行うことができます。Swift 5では新たに、Swiftランコマンドで実行ファイルをビルドせずにREPLにライブラリをインポートできるようになりました。Swift Package Manager自体はSwiftを使ってビルドされており、Swiftのオープンソースプロジェクトにもパッケージとして含まれています。

    Objective-Cとの相互運用性

    Swiftを使えば、まったく新しいアプリケーションを今すぐ作成したり、Swiftのコードを使用してAppに新しい特長や機能を実装したりすることができます。Swiftのコードは同じプロジェクトの中で既存のObjective-Cファイルと共存し、Objective-CのAPIもすべて利用できるため、簡単に取り入れることができます。

    Swiftの利用を開始するには、Xcodeをダウンロードして、「リソース」タブのチュートリアルに沿って手順を進めてください。