Swift
メインページ > 工学 > 情報技術 > プログラミング > Swift
Swiftは、Appleが、iOS、iPadOS、macOS、tvOS、および watchOS のために開発したオープンソースのプログラミング言語です。
環境準備

ローカルにコンパイル実行環境を作るのが困難、すぐにコンパイルと実行を試してみたい。そんな場合には、オンラインコンパイル実行環境を使うことも検討に値します。
環境準備

公式サイトの、Download Swiftからインストーラーを入手するのが基本です。
環境準備

公式サイトの、Download SwiftからTARBALLをダウンロードしてインストールします。
環境準備

パッケージマネージャによってパッケージ名と依存関係、インストールに使用するコマンドが異なります。
環境準備

公式では、RPMでも提供されていますが experimental use only との位置づけです
環境準備

最新のあるいはリリース前のバージョンのSwiftをインストールしたい場合は、ソースコードを入手しビルドします。
環境準備

インストールに成功したと思ったら、バージョン確認など簡単なコマンドを実行してみましょう。
環境準備

で確認できます。
環境準備

実行結果の一例(WindowsのPowershellから実行)
実行方法

コードは
実行方法

の1行です。これをテキストエディターでコードを書き、ファイル名 hello.swift 保存します。swiftのソースファイルの拡張子には .swift が使われます。
実行方法

実行方法は、まずコンパイルのために
実行方法

を実行します。
実行方法

すると、標準設定ならカレントディレクトリなどシステム標準の場所に ファイル名 の実行ファイルが出来るので、あとはそれを通常の実行ファイルと同じ方法で実行します。
実行方法

MS-DOSやWindowsでは、PATHが通っていなくてもカレントフォルダのファイルを名前を打つだけで実行できますが、他のプラットフォームの場合は
実行方法

のようなに ./ を前置してカレントディレクトのファイルであることを明示して実行します。
実行方法

コマンド
実行方法

で、コンパイルと実行を行えます。
実行方法

かつては「swift run ファイル名.swift」というコマンドでしたが、いまでは廃止され、上のようなコマンドになっています。
実行方法

で対話モードになります。
実行方法

終了したい場合、Ctrl + D ボタンで終了します。
定数と変数

変数は、値と結びついた識別子で初期化や代入によって結びつく値を変えることが出来ます。 変数は、キーワード var を使って宣言します。
定数と変数

定数は、一度しか値を初期化あるいは代入できない変数です。 定数は、キーワード let を使って宣言します。
定数と変数

型 Int は冒頭が大文字でなければなりません。Swiftでは大文字と小文字は区別されます。
定数と変数

定数や変数の名前のことを識別子( identifier )と言います(他にも関数・メソッド・クラス・クラスのメンバーなどの名前も識別子で、同じ名前空間の中では識別子は重複できません)。
定数と変数

この規則に違反したコードはコンパイルエラーになります。
定数と変数

ただし、識別子を `(バッククオーテーション)で括るとキーワードも識別子に使うことができます。
定数と変数

定数と変数は宣言時に初期化を省略できますが、初期化を省略した変数の値を参照するとコンパイル時にエラーになります。
定数と変数

初期値を伴って変数か定数が宣言された場合、型アノテーション(type annotation; : 型名の部分)を省略することができます。 これを型推論( type inference )と呼びます。
定数と変数

一般に定数と変数は宣言に初期化することは良い習慣だと考えられています。このため、多くのシチュエーションで型推定が可能となり型アノテーションが省略できます。
定数と変数

型アノテーションを省略すると、『コードの意図が読みにくくなる』とコードレビューで指摘されることがありますが、全部の宣言に型アノテーションを追加すると、『型アノテーションが冗長』とコードレビュー指摘されます。「どのような場合に、型アノテーションを書くべきか」一般則はありませんが let str = "abc" に型アノテーションを書くべきだと主張する人はまれなので、定数と変数の名前えらびは重要で、単に a や b の様な「色のない」 名前は選ぶべきではありません。
定数と変数

なお、いかなる数値型の変数についても暗黙の型変換( implicit conversion )が行われることはなく、型の違う数値同士の演算、右辺と左辺で型の異なる代入は全てコンパイルエラーとなります。
基本データ型

Swiftには、整数、浮動小数点数、真理値型、文字列型などの基本的なデータ型があります。これらのデータ型は、Swiftのプログラミングにおいて非常に重要な役割を果たします。本稿では、Swiftの基本データ型について、その特徴や使い方について解説していきます。
基本データ型

以下はSwiftにおける整数とそのバリエーションとリテラルに関する表です。
基本データ型

Swiftには、整数のリテラルに使用できる多くのオプションがあります。以下に、Swiftで使用できる整数のリテラル構文の例を示します。
基本データ型

これらのリテラルの前には、マイナス記号を使用して、負の整数を表すことができます。また、アンダースコア(_)を使用して、リテラルの読みやすさを向上させることができます。
基本データ型

以下はSwiftの浮動小数点数とそのバリエーション、およびリテラルの表です。
基本データ型

以下はSwiftのコード例です。
基本データ型

Swiftでは、真を表すのにtrue、偽を表すのにfalseを使用します。これらは、Boolというデータ型の値です。例えば、以下のように使用します。
基本データ型

以下はSwiftで使用可能な文字型、バリエーション、およびリテラルの表です:
基本データ型

こちらはSwiftでの文字型の実際のコード例です:
基本データ型

以下はSwiftの文字列と文字列の連結の方法です。まず、+演算子を使用して文字列を連結することができます。
基本データ型

また、+=演算子を使用して文字列を更新することもできます。
基本データ型

以下は、Swiftで文字列に値を埋め込む方法の例です。\(value)のように、文字列内に変数を\( )で囲んで埋め込みます。
基本データ型

また、String(format: "%@", value)のように、Stringクラスのformatメソッドを使用することもできます。以下は例です。
基本データ型

どちらの方法でも同じ結果が得られます。
基本データ型

このSwiftのコードは、文字列をUTF-8形式およびUTF-16形式でそれぞれカウントする方法と、文字列長を計算する方法を示しています。
基本データ型

このコードでは、Foundationフレームワークがインポートされているため、NSStringのメソッドであるlengthメソッドにアクセスできます。 また、character(at:)はNSStringにも実装されていますが、Swiftの組み込みのString型でも提供されています。
基本データ型

Swiftにおける配列は、複数の値を一箇所に保持することができるデータ構造です。Swiftでは、配列を宣言するために2つの方法があります。以下の表では、それぞれの方法について解説します。
基本データ型

以下は、Swiftにおける配列のバリエーションとリテラルのコード例です。
基本データ型

空の配列を定義する場合
基本データ型

ここで、Array<Int>()と[Int]()は、空の配列を宣言するための方法で、それぞれemptyArrayとemptyArray2に割り当てられます。同様に、[]は空の配列を宣言する省略形で、emptyArray3に割り当てられます。
基本データ型

配列のリテラルを使用する場合
基本データ型

ここで、[1, 2, 3]と[4, 5, 6]は、配列のリテラルと呼ばれるもので、それぞれarrayWithLiteral1とarrayWithLiteral2に割り当てられます。
基本データ型

配列にアクセスする方法
基本データ型

配列には、各要素に対応するインデックスがあります。上の例では、fruitsの最初の要素にアクセスするには、fruits[0]と書きます。インデックスは0から始まり、配列の最後の要素にアクセスするインデックスは(配列の要素数 - 1)となります。
基本データ型

+演算子を使うと、2つの配列を結合することができます。例えば、以下のように書くことができます。
基本データ型

+=演算子を使うと、配列自身を変更して結合することができます。例えば、以下のように書くことができます。
基本データ型

Swiftの配列は値型であるため、代入する場合にはコピーが作成されます。つまり、元の配列に影響を与えずに別の配列に代入することができます。例えば、以下のように書くことができます。
基本データ型

ただし、配列内の要素が参照型である場合は、代入先の配列でも同じオブジェクトが参照されるため、元の配列の要素に変更を加えた場合には代入先の配列にも同じ変更が反映されます。
基本データ型

このコードは、Swift言語で配列に対して行うことができるいくつかの操作を示しています。
基本データ型

最初に、配列の要素を追加する方法が示されています。append()メソッドは、配列の末尾に要素を追加します。+=演算子は、別の配列を末尾に追加することもできます。
基本データ型

次に、配列内の要素を挿入したり、置き換えたり、削除したりする方法が示されています。insert()メソッドは、特定の位置に要素を挿入します。要素を置き換えるには、要素のインデックスを指定して値を割り当てます。remove()メソッドは、指定したインデックスの要素を削除します。removeLast()メソッドは、配列の末尾の要素を削除します。また、配列スライスを使用して、複数の要素を一度に置き換えることもできます。
基本データ型

次に、配列を操作して新しい配列を作成する方法が示されています。map()メソッドは、配列内のすべての要素に対して関数を適用し、新しい配列を返します。filter()メソッドは、配列内の要素をフィルタリングし、指定した条件を満たす要素だけを含む新しい配列を返します。sorted()メソッドは、配列内の要素をソートし、新しい配列を返します。reduce()メソッドは、配列内の要素を畳み込んで単一の値を返します。forEach()メソッドは、配列内のすべての要素に対して、指定されたクロージャを実行します。
基本データ型

最後に、多次元配列に対して操作を行う方法が示されています。map()メソッドは、多次元配列内のすべての配列に対して、それぞれの要素の順序を反転した新しい配列を返します。flatMap()メソッドは、多次元配列内のすべての要素を1つの配列に平坦化します。また、オプショナル型の値を含む配列に対しても動作します。map()メソッドはオプショナル型の値を含む配列に対しては動作しますが、flatMap()メソッドはnil値を削除して新しい配列を返します。
基本データ型

Swiftの集合(Set)は、ユニークで順序がない要素のコレクションです。それぞれの要素は同じ型でなければなりません。重複した要素は1つの要素として扱われます。
基本データ型

以下は、Swiftの集合に関する基本的な機能の例です。
基本データ型

Swiftの集合(Set)には、forループや高階関数を使用して要素を処理することができます。
基本データ型

まず、forループを使用する場合は、次のように記述します。
基本データ型

この例では、Setの要素をfor-inループで1つずつ取り出し、それぞれの要素を処理しています。
基本データ型

次に、高階関数を使用する場合は、map()、filter()、reduce()のような関数が使用できます。
基本データ型

例えば、map()関数を使用して、Setの各要素に対して操作を行い、新しいSetを作成することができます。
基本データ型

この例では、Setの各要素を2倍して、新しいSetを作成しています。map()関数は、クロージャーを引数として受け取り、そのクロージャーでSetの各要素を操作しています。
基本データ型

また、filter()関数を使用して、Setの要素をフィルタリングすることができます。
基本データ型

この例では、Setの要素を2で割った余りが0のものだけを取り出し、新しいSetを作成しています。
基本データ型

最後に、reduce()関数を使用して、Setの要素を畳み込むことができます。
基本データ型

この例では、Setの各要素を合計しています。reduce()関数は、初期値とクロージャーを引数として受け取り、Setの各要素を畳み込んで、1つの値を生成しています。
基本データ型

Swiftの辞書(Dictionary)は、キーと値のペアを保存するためのコレクションです。キーと値はそれぞれ異なるデータ型である必要があります。辞書は、値を取得するためのキーを使用してアクセスできます。
基本データ型

辞書は、以下のように宣言されます。
基本データ型

ここで、KeyTypeはキーのデータ型を表し、ValueTypeは値のデータ型を表します。例えば、文字列をキーに持ち整数を値に持つ辞書は以下のように宣言できます。
基本データ型

辞書の要素にアクセスするには、キーを使用します。
基本データ型

存在しないキーにアクセスすると、nilが返されます。辞書にキーが存在するかどうかを確認するには、containsメソッドを使用します。
基本データ型

辞書に要素を追加するには、新しいキーと値のペアを辞書に追加します。
基本データ型

辞書から要素を削除するには、キーを指定してremoveValue(forKey:)メソッドを使用します。
基本データ型

辞書の要素を変更するには、新しい値をキーに割り当てます。
基本データ型

辞書のキーと値を反復処理するには、for-inループを使用します。
基本データ型

辞書のキーを反復処理するには、keysプロパティを使用します。
基本データ型

辞書の値を反復処理するには、valuesプロパティを使用します。
基本データ型

辞書にも、配列や集合と同様に map、filter、reduce などの高階関数が使用できます。
基本データ型

map は辞書の各要素に対して、変換処理を適用し、新しい辞書を作成するメソッドです。変換処理は、クロージャーの引数として、各要素の (key, value) のタプルを取ります。以下は、辞書 dict の各要素の値を2倍にした新しい辞書を作成する例です。
基本データ型

filter は辞書の各要素に対して、指定した条件を満たす要素だけを抽出して、新しい辞書を作成するメソッドです。条件は、クロージャーの引数として、各要素の (key, value) のタプルを取り、条件式を返します。以下は、値が奇数の要素だけを抽出した新しい辞書を作成する例です。
基本データ型

reduce は辞書の各要素を畳み込んで、1つの値を生成するメソッドです。初期値と、畳み込み処理をクロージャーの引数として渡します。畳み込み処理は、初期値と各要素の (key, value) のタプルを引数として受け取り、新しい値を返します。以下は、辞書 dict の全要素の値の和を求める例です。
基本データ型

Swiftのタプルは、複数の異なるデータ型を一つのグループにまとめることができます。タプルは、複数の値を返すときにも便利です。
基本データ型

以下は、タプルの例です。
基本データ型

タプルには、複数の要素をカンマ区切りで指定し、丸括弧で囲みます。
基本データ型

タプルの各要素は、インデックスを指定してアクセスすることができます。
基本データ型

また、タプルの各要素に名前を付けることもできます。
基本データ型

タプルは、関数の戻り値としても利用できます。複数の値を返す場合、タプルを使うとコードを簡潔に記述することができます。
基本データ型

この例では、findMinMax関数がタプルを返し、そのタプルには、最小値と最大値の値が含まれます。戻り値を受け取ったresultは、タプルであるため、.minと.maxを使って値を取得することができます。
基本データ型

Swiftにおけるオプショナル(Optional)は、値が存在する場合にはその値を持ち、存在しない場合にはnilという値を持つ特殊な型です。つまり、オプショナルは存在しない値を表現するための型です。
基本データ型

例えば、Int型の変数xを宣言したとき、その初期値はnilとなります。
基本データ型

このようにオプショナルを使うことで、変数に値が入るまで型を決めずに宣言することができます。
基本データ型

オプショナルの値にアクセスするには、アンラップ(unwrapping)が必要です。アンラップとは、オプショナルの値がnilでないことを確認してから、値にアクセスすることです。
基本データ型

以下は、オプショナルの値にアクセスする方法の例です。
基本データ型

上記の例では、オプショナル型の変数optionalIntに値10を代入しています。その後、if let文でoptionalIntがnilでないことを確認し、unwrappedIntにアンラップした値を代入しています。また、!演算子を使って強制的にアンラップすることもできます。ただし、optionalIntがnilである場合にはランタイムエラーが発生します。
基本データ型

また、オプショナル型には、guard let文を使ってもアンラップすることができます。
基本データ型

この例では、foo関数の引数optionalStrがnilでない場合には、unwrappedStrにアンラップされた値を使って処理を行い、nilである場合にはguard文の中の処理を行っています。
基本データ型

オプショナル型には、Null合体演算子( Nil-Coalescing Operator )?? を使用して、オプショナルの値がnilである場合に、デフォルト値を返すこともできます。
基本データ型

Swiftにおいて、オプショナルの値に対して簡潔かつ安全にアクセスする方法の1つに、「オプショナル連鎖 (Optional chaining)」があります。
基本データ型

オプショナル連鎖は、オプショナルのプロパティにアクセスする際に使用する「?」を使って、プロパティの存在を確認しながらアクセスを行うことができます。オプショナル連鎖が適用された式の値は、オプショナル値として評価されます。
基本データ型

以下は、オプショナル連鎖の例です。
基本データ型

上記の例では、personはPerson型のオプショナル値であり、そのageプロパティもオプショナルです。let age = person?.ageとすることで、personがnilでない場合に限り、ageにアクセスされます。ageの型は、Int?となります。
基本データ型

また、オプショナル連鎖は、プロパティだけでなくメソッドやサブスクリプトにも適用することができます。以下は、オプショナル連鎖を使用したメソッドの例です。
基本データ型

上記の例では、carはCar型のオプショナル値です。car?.drive()とすることで、carがnilでない場合に限り、driveメソッドが実行されます。
基本データ型

オプショナル連鎖の利用により、アンラップ処理を簡潔かつ安全に行うことができます。 ただし、オプショナル値を使用する場合は、値が存在しない場合に備えたハンドリングを行うことが重要です。
演算子

Swiftにおいて、式はプログラムで何かしらの値を生成するための構成要素です。式は、変数やリテラル、関数呼び出し、演算子、そしてそれらを組み合わせたものから構成されます。
演算子

演算子は、式内で値を操作するために使用されます。 Swiftには、算術演算子、比較演算子、論理演算子、代入演算子、範囲演算子、ビット演算子など、さまざまな種類の演算子があります。演算子は、変数や定数、リテラル値などのオペランドに対して、特定の操作を実行するために使用されます。
演算子

演算子は、一般的に、単項演算子(1つのオペランドを取る)、二項演算子(2つのオペランドを取る)または三項演算子(3つのオペランドを取る)に分類されます。Swiftでは、いくつかの演算子は、オプショナルや範囲、タプルなどの機能に特化しています。
演算子

このセクションでは、Swiftで使用できる演算子について詳しく説明します。演算子の優先順位、結合性、および使用例を示し、適切な演算子を使用して式を組み立てる方法を紹介します。
その他

識別子にはUnicode文字を用いることができます。
その他

文字列リテラルの中にある\(...)には、式の結果が展開される
その他

ヒアドキュメントには、ダブルクォーテーション3つを使用します。ヒアドキュメント内の行頭の空白は自動的にトリミングされます。
その他

数値リテラルのプレフィックスは"0b"で2進数、"0o"で8進数、"0x"で16進数を表す。
その他

浮動小数点リテラルは、通常の十進数表記に加え16進数表記もサポートしています。
その他

整数型と浮動小数点型のどちらでも、コードの見やすさのためにアンダースコア _ を桁の区切りとして挿入できます。
その他

アンダースコアは、代入文で代入する値を無視したいときに、仮の代入先として使用できます。
附録

エラトステネスの篩を、若干 Swift らしく書いてみました。
附録

最大公約数と最小公倍数を、若干 Swift らしく書いてみました。
附録

二分法を、若干 Swift らしく書いてみました。