Swift

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

Swiftは、Appleのすべてのプラットフォームに対応し、直感的に使えるパワフルなプログラミング言語です。シンプルでありながら表現力豊かな構文と最新の機能を備え、簡単に使い始めることができるSwiftは、デベロッパの皆さんを魅了することでしょう。Swiftでコーディングすれば、安全性を確保しながら、スピーディに動作するソフトウェアを開発することができます。

    モダン

    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 "Player(name: "Tomas", highScore: 50, history: [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のオブジェクトを作成したり使用したりしようとするとコンパイルタイムエラーとなり、これらの処理が停止する仕様になっています。これにより、コードの記述がより明快かつ安全になり、アプリ内でランタイムクラッシュが大量に発生することを防止できます。とはいえ、正当かつ適切な目的で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のコードが最適化されたマシンコードへと変換されるため、最新のハードウェアの性能を存分に引き出すことができます。構文や標準ライブラリにも調整が加えられ、最も直感的な方法でコードを記述できるようになっただけでなく、手首に着けたApple Watchからサーバ群に至るまで、最高のパフォーマンスが得られるようになりました。

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

    初めての言語として最適

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

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

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

    オープンソース

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

    クロスプラットフォーム

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

    サーバ向けのSwift

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

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

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

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

    Package Manager

    Swift Package Managerは、Swiftライブラリや実行形式ファイルのビルド、実行、テスト、パッケージ化を行う、単一のクロスプラットフォームツールです。ライブラリやソースコードをSwiftコミュニティに配信する際は、Swiftパッケージが非常に役立ちます。パッケージの構成はSwiftで記述されているため、ターゲットの構成、製品の宣言、パッケージの依存性の管理を簡単に行うことができます。Swiftパッケージには、プロジェクトの構築および付加的なツール機能の提供を支援するカスタムコマンドを含めることもできます。Swift Package Manager自体はSwiftを使ってビルドされており、Swiftのオープンソースプロジェクトにもパッケージとして含まれています。

    Objective-CとC++の相互運用性

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

    今すぐ始める

    Xcodeをダウンロードし、ドキュメントとサンプルコードを参考にしながら、Swiftを使用してアプリを開発する方法を学びましょう。

    リソースを見る