Swift 4.0 入門


ここでは、Swift プログラミング言語の使い方について説明します。


Swift に慣れていない場合は、Swift プログラミング言語Swift のツアー を参照して、言語の最も重要な概念と機能を簡単な紹介をご覧ください。


Swift のインストール


Swift を使用するための第一歩は、コンパイラとその他の必要な部品をダウンロードしてインストールすることです。ダウンロード のページに移動して、ターゲットプラットフォーム用の指示に従って下さい。


以下の例に従うために、$PATH に Swift を追加したのを確認してください。


Linux の場合


まず、clang をインストールします。


$ sudo apt-get install clang


Linux 上の Swift ツールチェーンをシステムルート以外のディレクトリにインストールした場合、Swift インストールの実際のパスを使用して以下のコマンドを実行する必要があります。


$ export PATH=/path/to/Swift/usr/bin:"${PATH}"


swift コマンドを入力し、--version フラグを渡して、期待されるバージョンの Swift を実行していることを確認できます。


$ swift --version
Apple Swift version 2.2-dev (LLVM ..., Clang ..., Swift ...)


バージョン番号の -dev の添え字は、リリースバージョンではなく 開発中 のビルドであることを示すために使用されます。


REPL の使用


他の引数なしで swift コマンドを実行すると、入力した Swift コードの結果を読み取り、評価し、印刷する対話型シェルである REPL が起動します。


$ swift
Welcome to Apple Swift version 2.2. Type :help for assistance.
  1>


REPL とのやりとりは、Swift を体験するのに最適な方法です。たとえば、式 1 + 2 を入力すると、式の結果 3 が次の行に出力されます。


    1> 1 + 2
$R0: Int = 3


定数と変数に値を代入し、後続の行に使用することができます。たとえば、 StringHello、world! は、定数 greeting に代入することができ、引数として print(_:) 関数に渡すことができます:


  2> let greeting = "Hello!"
greeting: String = "Hello!"
  3> print(greeting)
Hello!


無効な式を入力すると、REPL は問題が発生した場所を示すエラーを出力します。


let answer = "forty"-"two"
error: binary operator '-' cannot be applied to two 'String' operands
let answer = "forty"-"two"
                 ~~~~~~~^~~~~~


上矢印キーと下矢印キー( および )を使用して、REPL に入力した前の行に行ったり来たりできます。これにより、行全体を再入力せずに前の式にわずかな変更を加えることができます。これは、前の例のようなエラーを修正するのに特に便利です。


let answer = "forty-two"
answer: String = "forty-two"


REPL のもう 1 つの便利な機能は、特定のコンテキストで使用できる関数とメソッドを自動的に提案できることです。たとえば、String 値のドット演算子の後に re を入力してからタブキー () を押すと、REPL は remove(at:) および replaceSubrange(bounds:with:) のような、使用可能な補完リストを与えます。


5> "Hi!".re⇥
Available completions:
	remove(at: Index) -> Character
	removeAll() -> Void
	removeAll(keepingCapacity: Bool) -> Void
	removeSubrange(bounds: ClosedRange<Index>) -> Void
	removeSubrange(bounds: Range<Index>) -> Void
	replaceSubrange(bounds: ClosedRange<Index>, with: C) -> Void
	replaceSubrange(bounds: ClosedRange<Index>, with: String) -> Void
	replaceSubrange(bounds: Range<Index>, with: C) -> Void
	replaceSubrange(bounds: Range<Index>, with: String) -> Void
	reserveCapacity(n: Int) -> Void


for-in ループで配列を反復処理する時など、コードブロックを開始すると、REPL は自動的に次の行をインデントし、プロンプト文字を > から . に変更し、その行に入力されたコードは、コードブロック全体が評価されたときにのみ評価されることを示します。


  6> let numbers = [1,2,3]
numbers: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  7> for n in numbers.reversed() {
  8.     print(n)
  9. }
3
2
1


Swift のすべての機能は、制御フロー文の作成から構造体およびクラスの宣言およびインスタンス化まで、REPL から利用できます。


MacOS では Darwin、Linux では Glibc など、使用可能なシステムモジュールをインポートすることもできます。


MacOS では


1> import Darwin
2> arc4random_uniform(10)
$R0: UInt32 = 4


Linux では


1> import Glibc
2> random() % 10
$R0: Int32 = 4


パッケージマネージャの使用


Swift パッケージマネージャは、ライブラリや実行ファイルをビルドしたり、異なるプロジェクト間でコードを共有するためのコンベンションベースのシステムを提供します。


これらの例では、あなたのパスで swift を利用できると仮定しています。詳細については、インストール を参照してください。利用可能になると、swift packageswift buildswift test の、パッケージマネージャツールを呼び出すことができます。


$ swift package --help
OVERVIEW: Perform operations on Swift packages
...


パッケージの作成


新しい Swift のパッケージを作成するには、まずディレクトリを作成して Hello という名前を入力します。


$ mkdir Hello
$ cd Hello


すべてのパッケージには、ルートディレクトリに Package.swift というマニフェストファイルが必要です。以下のように Hello という名前の最小限のパッケージを作成できます。


$ swift package init


デフォルトでは、init コマンドはライブラリパッケージディレクトリ構造体を作成します:


├── Package.swift
├── Sources
│   └── Hello.swift
└── Tests
    ├── HelloTests
    │   └── HelloTests.swift
    └── LinuxMain.swift


swift build を使用してパッケージをビルドすることができます。これにより、マニフェストファイル Package.swift に記述されている依存関係をダウンロードし、解決し、コンパイルします。


$ swift build
Compile Swift Module 'Hello' (1 sources)


パッケージのテストを実行するには、swift test を使用します:


$ swift test
Compile Swift Module 'HelloTests' (1 sources)
Linking ./.build/debug/HelloPackageTests.xctest/Contents/MacOS/HelloPackageTests
Test Suite 'All tests' started at 2016-08-29 08:00:31.453
Test Suite 'HelloPackageTests.xctest' started at 2016-08-29 08:00:31.454
Test Suite 'HelloTests' started at 2016-08-29 08:00:31.454
Test Case '-[HelloTests.HelloTests testExample]' started.
Test Case '-[HelloTests.HelloTests testExample]' passed (0.001 seconds).
Test Suite 'HelloTests' passed at 2016-08-29 08:00:31.455.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'HelloPackageTests.xctest' passed at 2016-08-29 08:00:31.455.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.001) seconds
Test Suite 'All tests' passed at 2016-08-29 08:00:31.455.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.001 (0.002) seconds


実行可能ファイルの作成


パッケージに main.swift という名前のファイルが含まれている場合、そのパッケージは実行可能ファイルとみなされます。パッケージマネージャは、そのファイルをバイナリ実行可能ファイルにコンパイルします。


この例では、パッケージは "Hello、world!" を出力する Hello という名前の実行可能ファイルを生成します。


初めに、ディレクトリを作成して Hello という名前を入力します。


$ mkdir Hello
$ cd Hello


実行可能なタイプで swift パッケージの init コマンドを実行します。


$ swift package init --type executable


swift build コマンドを実行してパッケージをコンパイルします。


$ swift build


コマンドが終了すると、ビルドされた製品は .build ディレクトリにあります。以下のコマンドで Hello プログラムを実行します。


$ .build/debug/Hello
Hello, world!


次のステップとして、新しいソースファイルに新しい sayHello(name:) 関数を定義し、print(_:) を直接呼び出すのではなく実行可能な呼び出しを用意しましょう。


複数のソースファイルの操作


Sources/ ディレクトリに Greeter.swift という名前の新しいファイルを作成し、以下のコードを入力して下さい。


func sayHello(name: String) {
    print("Hello, \(name)!")
}


この sayHello(name:) 関数は単一の String 引数をとり、"World" という単語を関数の引数で置き換える前に "Hello" の挨拶を出力します。


main.swift をもう一度開いて、既存のコンテンツを以下のコードに置き換えます。


if CommandLine.arguments.count != 2 {
    print("Usage: hello NAME")
} else {
    let name = CommandLine.arguments[1]
    sayHello(name: name)
}


前のようにハードコードされた名前を使用するのではなく、main.swift はコマンドラインの引数から読み込みます。また、print(_:) を直接呼び出す代わりに、main.swiftsayHello(name:) メソッドを呼び出します。このメソッドは Hello モジュールの一部であるため、import 文は必要ありません。


swift run を実行し、新しいバージョンの Hello を試してみましょう:


$ swift build
$ .build/debug/Hello `whoami`


モジュールをビルドし、依存関係をインポートし、システムライブラリをマップする方法を含む Swift Package Manager について学ぶには、Web サイトの Swift Package Manager のセクションを参照してください。


LLDB デバッガの使用


LLDB デバッガを使用すると、Swift プログラムを段階的に実行したり、ブレークポイントを設定したり、プログラムの状態を検査したり変更したりすることができます。


たとえば、factorial(n:) (階乗) 関数を定義し、その関数を呼び出した結果を出力する以下の Swift コードを考えてみましょう。


func factorial(n: Int) -> Int {
    if n <= 1 { return n }
    return n * factorial(n: n - 1)
}

let number = 4
print("\(number)! is equal to \(factorial(n: number))")


上記のコードで Factorial.swift という名前のファイルを作成し、コマンドライン引数としてファイル名を渡し、デバッグ情報を生成する -g オプションとともに swiftc コマンドを実行します。これにより、現在のディレクトリに Factorial という名前の実行可能ファイルが作成されます。


$ swiftc -g Factorial.swift
$ ls
Factorial.dSYM
Factorial.swift
Factorial*


Factorial プログラムを直接実行する代わりに、LLDB デバッガを lldb コマンドへのコマンドライン引数として渡して実行します。


$ lldb Factorial
(lldb) target create "Factorial"
Current executable set to 'Factorial' (x86_64).


これにより、LLDB コマンドを実行できるインタラクティブなコンソールが起動します。


LLDB コマンドの詳細については、LLDB チュートリアル を参照してください。



factorial(n:) 関数の 2 行目にブレークポイントを breakpoint set(b) コマンドで設定し、関数が実行されるたびにプロセスが中止するようにします。


(lldb) b 2
Breakpoint 1: where = Factorial`Factorial.factorial (Swift.Int) -> Swift.Int + 12
 at Factorial.swift:2, address = 0x0000000100000e7c


run(r) コマンドを使用してプロセスを実行します。プロセスは、factorial(n:) 関数を呼び出した場所で停止します。


(lldb) r
Process 40246 resuming
Process 40246 stopped
* thread #1: tid = 0x14dfdf, 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12
 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2
   1    func factorial(n: Int) -> Int {
-> 2        if n <= 1 { return n }
   3        return n * factorial(n: n - 1)
   4    }
   5
   6    let number = 4
   7    print("\(number)! is equal to \(factorial(n: number))")


n パラメータの値を調べるには、print (p) コマンドを使用します。


(lldb) p n
(Int) $R0 = 4


print コマンドは Swift の式も評価できます。


(lldb) p n * n
(Int) $R1 = 16


backtrace (bt) コマンドを使用して、factorial(n:) が呼び出されるまでのフレームを表示します。


(lldb) bt
* thread #1: tid = 0x14e393, 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12
 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2
    frame #1: 0x0000000100000daf Factorial`main + 287 at Factorial.swift:7
    frame #2: 0x00007fff890be5ad libdyld.dylib`start + 1
    frame #3: 0x00007fff890be5ad libdyld.dylib`start + 1


continue (c) コマンドを使用して、ブレークポイントが再びヒットするまでプロセスを再開します。


(lldb) c
Process 40246 resuming
Process 40246 stopped
* thread #1: tid = 0x14e393, 0x0000000100000e7c Factorial`Factorial.factorial (n=3) -> Swift.Int + 12
 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=3) -> Swift.Int + 12 at Factorial.swift:2
   1    func factorial(n: Int) -> Int {
-> 2        if n <= 1 { return n }
   3        return n * factorial(n: n - 1)
   4    }
   5
   6    let number = 4
   7    print("\(number)! is equal to \(factorial(n: number))")


factorial(n:) への 2 番目の呼び出しの n パラメータの値を調べるには、print (p) コマンドを再度使用します。


(lldb) p n
(Int) $R2 = 3


すべてのブレークポイントを無効にするには、breakpoint disable (br di) コマンドを使用し、終了するまでプロセスを実行させるには continue (c) コマンドを使用します。


(lldb) br di
All breakpoints disabled. (1 breakpoints)
(lldb) c
Process 40246 resuming
4! is equal to 24
Process 40246 exited with status = 0 (0x00000000)


Swift REPL、ビルドシステム、デバッガについて紹介しましたので、次に何をすべきかについていくつか提案します。





目次
Xcode 9 の新機能

SwiftLogo
  • Swift について
  • 特徴
    安全
    Swift.org とオープンソース
    プロジェクト
    プラットフォームサポート
    アップルのプラットフォーム
    Linux
  • ブログ:Swift 4.0 リリース!
  • 言語の更新
    文字列
    コレクション
    アーカイブとシリアル化
    その他の言語の更新
    新しい互換モード
    Package Manager の更新
    文書化
  • プラットフォーム
  • Linux
    Apple(Xcode)
    ソース
  • Swift のローカルリファクタリング
  • リファクタリングの種類
    カーソルベースのリファクタリング
    レンジベースのリファクタリング
    診断
    テスト
    文脈上のリファクタリングテスト
    コード変換テスト
    Xcode との統合
    潜在的なローカルリファクタリングの考え方
  • Swift のダウンロード
  • リリース
    Swift 4.0
    Swift 3.1.1
    Swift 3.1
    Swift 3.0.2
    Swift 3.0.1
    Swift 3.0
    Swift 2.2.1
    Swift 2.2
    スナップショット
    基幹となる開発(マスター)
    古いスナップショット
    Swift 4.0 の開発
    古いスナップショット
    Swift 3.1 の開発
    古いスナップショット
    古いリリースの分岐
    ダウンロードを使用して
    インストール
    MacOS でのコード署名
    Linux
    必要
    サポートしているターゲットプラットフォーム
    インストール
    アクティブな署名鍵
  • Swift 4.0 入門
  • Swift のインストール
    Linux の場合
    REPL の使用
    パッケージマネージャの使用
    パッケージの作成
    実行可能ファイルの作成
    複数のソースファイルの操作
    LLDB デバッガの使用
  • 文書化
  • Swift プログラミング言語
    翻訳
    API 設計ガイドライン
  • API 設計ガイドライン
  • 目次
    基礎
    ネーミング
    明確な使用の促進
    流暢な使用を目指す
    用語をよく使う
    規約
    一般的規約
    パラメータ
    引数ラベル
    特別な命令
  • Swift 4 への移行
  • 移行前の準備
    Swift 移行アシスタント
    Swift 4 移行の変更の概要
    SDK の変更点
    注目すべき特別なケース
    新しい String
    デフォルトのパラメータ値は public です
    移行の後
    移行に関する既知の問題
    Carthage/CocoaPods プロジェクトの使用
    その他
  • Swift 3 への移行
  • 移行前の準備
    Swift 移行アシスタント
    Swift 3 移行変更の概要
    API 設計ガイドライン
    SDK
    Swift 標準ライブラリ
    言語
    移行後
    Carthage/CocoaPods プロジェクトの使用 既知の移行の問題
    Swift 標準ライブラリ
    SDK
    Swift 3 言語
    その他
  • ソースコード
  • コンパイラと標準ライブラリ
    Core Library
    パッケージマネージャ
    Xcode の Playground サポート
    クローンされたリポジトリ
  • コミュニティガイドライン
  • コミュニケーション
    コミュニティの構造
    プロジェクトリーダー
    コアチーム
    コードオーナー
    ライセンス
    Runtime Library Exception (実行時ライブラリ例外)
    ソースコードの著作権とライセンス
    投稿
    入門
    コードの貢献 (投稿)
    新しい機能の提案
    行動規範
    投稿者行動規範 v1.3
    報告
    メーリングリスト
    General Interest
    Swift 開発
    Swift の発展
    通知
  • 投稿
  • 質問に答える
    バグを報告する
    バグのトリアージ
    コードの投稿
    段階的な開発
    メッセージをコミットする
    変更の帰属
    コードテンプレート
    コードのレビュー
    テスト
    品質
    コミットアクセス
    外部ライブラリ依存関係の追加
    Swift 発展プロセスへの参加
    LLVM と Swift
    LLVM の変更はどこで行われますか?
    Swift と LLVM 開発者ポリシー
  • Swift の継続的インテグレーション
  • 構成
    ジョブの組織
    ジョブの構成
    使用法
    リクエストのテスト
  • Swift ソースの互換性
  • プロジェクトの現在のリスト
    プロジェクトの追加
    合格基準
    プロジェクトの追加
    プロジェクトの維持
    リクエストのテスト
    プロジェクトをビルドする
    フォーカスエリア
  • ABI の安定性
  • データレイアウト
    メタデータ型
    切り分け
    呼び出し規約
    実行時
    標準ライブラリ
  • サーバーAPIプロジェクト
  • フォーカスエリア
    移植性
    外部ライブラリの使用
    ワークグループ
    舵取りチーム
    ステークホルダー
    開発プロセス
    API の提案
    プロトタイプ化と開発
    リリースプロセス
    メーリングリスト
  • コンパイラと標準ライブラリ
  • コンパイラのアーキテクチャ
    標準ライブラリの設計
  • パッケージマネージャ
  • 概念の概要
    モジュール
    パッケージ
    製品
    依存関係
    例の使用法
    ライブラリパッケージの作成
    ビルド構成文の使用
    依存関係のインポート
    副依存関係の解決
    コミュニティの提案
  • Swift コアライブラリ
  • プロジェクトの状態
    Foundation
    libdispatch
    XCTest
  • REPL とデバッガ、プレイグラウンド
  • なぜ REPL とデバッガを組み合わせるのか?
    Xcode プレイグラウンドサポート












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)












    トップへ(Swift 4.0)