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 らしく書いてみました。