Swift の使用開始
学習の目的
この単元を完了すると、次のことができるようになります。
- Swift の安全機能で Objective-C で生じる問題をどのように解決できるか説明する。
- Xcode のプレイグラウンドが便利な理由を説明する。
- プレイグラウンドで Swift コードを実行する。
- print ステートメントを記述する。
アプリケーションのアイデアが浮かび、そのコンセプトをどうやって実現しようかと考えを巡らせたことはありませんか? このモジュールは、そのようなユーザーを対象としています。このアプリケーション開発のジャーニーでは、最初に iOS 開発ツールと基本的なプログラミングのコンセプトに焦点をあてます。この基礎を学んだうえで実践的な課題に従って、簡単なアプリケーションを作成します。
学習環境の設定
アプリケーションの作成方法の学習では、多数のツールとリソースを必要とします。そのときどきに応じて、Xcode で複数のプロジェクトやファイルを開いたり、デスクトップ上にこのモジュール、Xcode に関するドキュメント、Safari、アセットを開いたりすることがあります。アプリケーションの作成を開始すると、ワークスペースを常に整理した状態にしておく必要があることに気付くでしょう。
アプリケーション間を移動する方法はあなたが決めます。すべてのツールを 1 つのビューに表示できるよう分割画面モードを使用する生徒もいれば、各アプリケーションを全画面モードで実行し、必要に応じてアプリケーションを切り替える方法を好む生徒もいます。
全画面モードにするには、ウィンドウの左上にある緑色 (3 番目) の円をクリックするか、キーボードショートカット Control-Command-F 使用します。ミッションコントロール、またはキーボードショートカットの Control-左矢印と Control-右矢印を使用して全画面表示されたアプリケーション間を移動できます。
必要なものを用意する
このガイドのレッスンを完了するには、次が必要です。
- macOS High Sierra または macOS Mojave を実行する Mac。
- Xcode 10。必要に応じて、Mac App Store からダウンロードしてください。
Xcode の一部の機能にはシステム管理者の権限が必要です。これらの機能を初めて使用するときに、Mac の管理アカウントのログイン情報を入力するよう求められます。
Swift とは?
Swift は Apple デバイス用のアプリケーションを作成するために設計された最新のプログラミング言語です。Apple は 2014 年の Apple Worldwide Developers Conference (WWDC) で、iOS と macOS 用のアプリケーションを作成するための Swift を発表しました。その後 Apple は、Swift をプライマリプログラミング言語として使用する watchOS と tvOS を発表しました。
2015 年 12 月には、開発者がコードやフィードバックを提供できる GitHub で、オープンソースプロジェクトして Swift 言語がリリースされました。つまり Swift のオープンソース化により、開発者コミュニティに最適な機能や改善を提供することで開発者は Swift の発展において積極的な役割を果たすことができます。
Swift の起源
1990 年代以降、Apple デバイス用のアプリケーションを作成する開発者のほとんどが、C プログラミング言語上に構築される Objective-C 言語を使用してきました。Swift では、Objective-C の使用中にうまく機能したコンセプトから得た教訓が生かされ、機能しなかったコンセプトは破棄されています。
1984 年の Objective-C のリリース以降、テクノロジーは飛躍的な進歩を遂げており、Apple はそこに最新のプログラミングコンセプトを取り入れた言語を作るチャンスを見いだしました。
開発者は Swift を使用して、Objective-C で記述されたコードよりも安全でエラーが発生しにくく、管理しやすいうえに、表現性に優れたコードを記述できるようになりました。
安全性の向上
Swift には安全機能が備わっており、アプリケーションがクラッシュしにくいコードを記述することができます。まだ理解していない用語があるかもしれませんが、Apple がこれらの安全機能を実装した理由を理解することが重要です。Swift には、次のような安全機能があります。
- エラー処理。Swift には強力なエラー処理機能があり、記述するコードのバグの数を減らし、アプリケーションのクラッシュや予期しない動作を引き起こす可能性があるシナリオに適切に対応できます。
- 型安全。作成、操作、割り当てを行う各オブジェクトの型を明確に指定する必要があります。たとえば、integer 型を指定した変数を宣言し、後からその変数に文字列値を割り当てると、Swift コンパイラーでエラーが発生します。この安全機能により、ユーザーがアプリケーションを実行している実行時ではなく、コンパイラーでのコンパイル時に型のエラーが検出されます。型安全では、ユーザーの手に渡る前にエラーを検出して修正することができます。
- オプショナル。オプショナルを使用して、コードで値がある場合とない場合を表現します。変数が値を持てないことを表現する必要がある場合、optional 型が必要です。たとえば、品目をカテゴリに分類するオンラインストアアプリケーションを使用していて、カテゴリに属さない品目があるとします。その他のカテゴリを作成してもよいですが、意図を明確に示す方法は、品目のカテゴリをオプショナルとして識別することです。
- 配列の境界チェック。配列は、同種の項目を順序付きリストに整理します。境界チェックとは、アプリケーションによる配列外のデータへのアクセスが許可されないことを意味します。境界チェックがないと、アプリケーションが配列の境界外のメモリにアクセスすることができ、悪用される可能性が生じます。
- 初期化。新しいインスタンスを使用する準備が整う前に、初期化を使用して特定の型のインスタンスを設定します。Objective-C の場合、オブジェクトを正しく初期化するにはベストプラクティスに従う必要があります。Swift の場合、これらのベストプラクティスが体系化されているため、コンパイルで正しく初期化を行うことができます。その結果、実行時の前にコンパイラーで Swift の初期化エラーが検出されます。
機能の最新化
Swift には、最新のプログラミング言語の多数の側面が組み込まれおり、次の機能が含まれています。
- 型推論。通常 Swift コンパイラーでは、オブジェクト型がコードで明示的に宣言されていない場合、割り当てられた値に基づいて各オブジェクトの型を判断できます。
- 優れた表現。Swift では、簡潔なコードを記述し、意図を明確に示すことができます。たとえば、ボタンのタイトルの色のプロパティを設定する場合、Swift では次のように記述できます。
button.setTitleColor(.blue, for: .normal)
SwiftUI では次のようになります。
Button(action: {}) { Text("Submit") .foregroundColor(Color.blue) }
Objective-C で同じ機能を実行するには、次のように記述できます。
[button setTitleColor:UIColor.blue forState:UIControlStateNormal];
Swift の例のほうが、より簡潔で可読性に優れています。また、経験が豊富な開発者は、Swift の構文に見覚えがあるかもしれません。
- ジェネリクス。複数のシナリオで使用できるコードを記述するときにジェネリクスを使用すると、時間の節約になり、コードの量や発生するエラーの数を減らすことができます。ジェネリクスを使用しないと、コードを繰り返すことになり、エラーを繰り返す可能性が生じます。
- 名前空間。Objective-C では、変数がすべてグローバルなので、コード内のどこからでも変数にアクセスできます。グローバル変数はセキュリティ上の問題や名前の競合を引き起こす可能性があるため、厳格な命名規則に従うのが一般的です。Swift では、名前空間内に変数や関数を作成して名前の競合を回避します。
- 関数型プログラミングパターン。Swift には、関数型プログラミングのコンセプト (map、reduce、filter など) が取り入れられています。これらの関数でコードが簡略化され、これまで複数行にわたるコードが必要だった一般的なアクションが合理化されます。関数型プログラミングパターンを使用すると、アプリケーションを確定的にすることができます。つまり、関数の結果が変わるのは、入力が変更された場合のみです。
このモジュールでは、これらの各機能の意味と、安全、迅速、表現性に優れたコードの記述に各機能がどのように関連しているのかを学習します。
Hello, World!
新しいプログラミング言語で開発を始めるときに一般的なのは、Hello, world! アプリケーションというどの言語でも記述できる簡単なプログラムを作成することです。このプログラムは、画面に「Hello, world!」と表示します。
.swift
ファイル拡張子を使用するテキスト形式ファイルに Swift コードを記述します。ファイル内の各行はステートメントを表し、プログラムは 1 つ以上のステートメントで構成されます。これらは、アプリケーションで実行される操作の指示です。
このモジュールを学習すると、コードの特定のセクションが実行されるのかどうかをフロー制御ステートメント (if else
) で、コードのセクションが実行される回数をループ (for in
、while
) でそれぞれ制御したり、データを渡す方法を制御したりできるようになります。
プログラムが、膨大な数のステートメントを記述した数百個のファイルで構成されている場合があります。コンパイラーは、すべてのファイルを 1 つのプログラムにまとめて、コードを実行可能にします。
まずは、簡単なアプリケーションから始めましょう。Swift では Hello, world! アプリケーションをどのように作成するのでしょうか?
print("Hello, world!")
上記のコードから推測できるように、print()
は String
という名前のテキストを使用し、コンソールにそのテキストを表示する関数です。
コンソールは、テキストの入力と表示を行う、システム管理のツールです。かつては、コンピューターとのやりとりはすべてコンソール (コマンドラインインターフェース) を介して行われました。現在、ほとんどのタスクにグラフィカルユーザーインターフェースがありますが、開発者は今でもコンソールを使用してプログラミングタスクや管理タスクを数多く行っています。実際、使用するほぼすべてのシステムのバックグラウンドにコンソールがあり、グラフィカルユーザーインターフェースを使用している場合でもアクセスすることができます。
プレイグラウンドについて
Swift の最も重要な機能の 1 つにプレイグラウンドがあります。これは単純な形式の Swift コードを実行し、結果を簡単に参照できる Xcode の文書型です。プレイグラウンドでコードを記述するときには、コードがどのように実行されるのかを結果サイドバーで確認できます。
アプリケーションのコードを妨げずに、プレイグラウンドで安全に Swift コードでいろいろ試してみることができます。プレイグラウンドでは、より多くのコードを 1 か所で簡単に管理し、結果サイドバーに複数の結果を表示できます。プレイグラウンドを使用して Swift コードのプロトタイプを作成し、テスト後に Xcode プロジェクトにコードを移動します。
技術的なレベルで言うと、プレイグラウンドは main.swift
ファイルを囲むファイルラッパーです。コードを編集するたびに、プレイグラウンドを実行して結果を確認できます。
画面下部のデバッグコンソールは、Swift コードの結果を直接プレイグラウンドに表示します。
すべての式の結果は右サイドバーに表示されます。サイドバーまたはデバッグ領域に表示されるテキストより詳細な結果を表示するには、Quick Look ツールを使用します。
詳細をインラインで表示するには、[Show Results (結果を表示)] ボタンを使用します。
Hello, world! アプリケーションの作成
Xcode プレイグラウンドを使用して、初めての Hello, world! アプリケーションを作成してみましょう。
- Xcode を開きます。
- Xcode のメニューバーから [File (ファイル)] > [New (新規)] > [Playground (プレイグラウンド)] を選択して、新しいプレイグラウンドファイルを作成します。
- [iOS platform (iOS プラットフォーム)] を選択し、[Blank (空白)] テンプレートを選択します。
- プレイグラウンドに「Hello, world!」と名前を付けてフォルダーに保存します。整理しやすいように、Swift と Xcode の学習に使用する専用フォルダーを作成することをお勧めします。
- デフォルトのプレイグラウンドには
import
ステートメントが含まれていることに気が付きましたか?import UIKit
ステートメントを使用すると、UIKit
フレームワークで定義されたコードを使用できるようになります。このモジュールの各課題に取り組んでいくにつれ、UIKit
フレームワークがさらに重要になります。通常は、すべてのプレイグラウンドにimport
ステートメントを残しておきます。
- デフォルトのプレイグラウンドには
-
[Execute Playground (プレイグラウンドを実行)] (内側に三角形がある青い円) をクリックして、コードを実行します。
- デフォルトのプレイグラウンドには、変数
var str = "Hello, playground"
も含まれています。文字列値が結果サイドバーに表示されます。
- デフォルトのプレイグラウンドには、変数
- 新しい行に、
print("Hello, world!")
と入力します。 -
[Execute Playground (プレイグラウンドを実行)] をクリックして、新しいコードを実行します。
- 結果サイドバーとデバッグコンソールに「Hello, world!」が表示されます。
- print 関数の "Hello, world!" を
str
に置き換えます。新しいコードは、「Hello, world!」というテキストの代わりにstr
変数の値を表示します。
このコード変更が正常に動作するのはなぜでしょうか? print
関数は String
パラメーターを取り、その値をコンソールに表示します。"Hello, World!" はリテラル String
であり、str
は String
値を格納する変数なので、どちらの例も正常に動作します。
次の単元では、文字列と変数について学習します。
ラボの終了
Swift を実際に使ってみる準備はできていますか? 課題で学習したことを Lab - Introduction.playground で練習してください。