Swift 4.2 日本語化計画 : Swift 4.2
Swift 入門
ここでは、Swift プログラミング言語の使い方について説明します。
Swift に慣れていない場合は、Swift プログラミング言語 の Swift のツアー を参照して、言語の最も重要な概念と機能の簡単な紹介をご覧ください。
Swift のインストール
Swift を使用するための第一歩は、コンパイラとその他の必要な部品をダウンロードしてインストールすることです。ダウンロード のページに移動して、あなたのターゲットプラットフォーム用の指示に従って下さい。
以下の例に従うために、$PATH に Swift を追加したのを確認してください。
macOS の場合
macOS 上でダウンロード可能なツールチェーンのデフォルトの場所は /Library/Developer/Toolchains です。以下のコマンドを使用すると、ターミナルから最新のインストール済みツールチェーンを利用できるようにできます。
$ export TOOLCHAINS=swift
インストールされている他のツールチェーンを選択するには、TOOLCHAINS 変数内のその ID を使用します。ID は、ツールチェーンの Info.plist ファイルにあります。
$ /usr/libexec/PlistBuddy -c "Print CFBundleIdentifier:" /Library/Developer/ Toolchains/swift-4.0-RELEASE.xctoolchain/Info.plist org.swift.4020170919 $ export TOOLCHAINS=org.swift.4020170919
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
定数と変数に値を代入し、後続の行で使用することができます。たとえば、 String 値 Hello、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 package,swift run,swift build,swift 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 ├── README.md ├── Sources │ └── Hello │ └── 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/x86_64-apple-macosx10.10/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 run コマンドを使用します。
$ swift run Hello Compile Swift Module 'Hello' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/Hello Hello, world!
注:このパッケージには実行可能ファイルが 1 つしかないので、swift run コマンドから実行可能ファイル名を省略できます。
また、swift build コマンドを実行してパッケージをコンパイルし、.build ディレクトリからバイナリを実行することもできます。
$ swift build Compile Swift Module 'Hello' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/Hello $ .build/x86_64-apple-macosx10.10/debug/Hello Hello, world!
次のステップとして、新しいソースファイルに新しい sayHello(name:) 関数を定義し、print(_:) を直接呼び出すのではなく実行可能な呼び出しを用意しましょう。
複数のソースファイルの操作
Sources/Hello ディレクトリに 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.swift は sayHello(name:) メソッドを呼び出します。このメソッドは Hello モジュールの一部であるため、import 文は必要ありません。
swift run を実行し、新しいバージョンの Hello を試してみましょう:
$ swift run Hello `whoami`
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、ビルドシステム、デバッガについて紹介しましたので、次に何をすべきかについていくつか提案します。
- パッケージマネージャプロジェクトページ を見て、Swift ビルドシステムとパッケージマネージャーを深く理解してください。
- Swift コミュニティに参加するさまざまな方法について学ぶには、投稿 をお読みください。
- developer.apple.com/swift にアクセスして、ビデオ、サンプルコード、プレイグラウンドなどの追加の Swift リソースをご覧ください。