Swift (プログラミング言語)
Swift（スウィフト）は、アップルのiOSおよびmacOS､Linuxで利用出来るプログラミング言語。Worldwide Developers Conference (WWDC) 2014で発表された。アップル製OS上で動作するアプリケーションの開発に従来から用いられていたObjective-CやObjective-C++、C言語と共存することが意図されている。
Swiftは、マルチパラダイムのコンパイラプログラミング言語であるが、XcodeのPlaygroundsの上やターミナルでインタラクティブにデバッグする事が可能である。
LLVMコンパイラが使われており、ライブコーディングに対応していることが特徴。
並列スクリプト言語のとは名称を同じくするが、別言語。
Swiftは2010年にLLVMとClangの始祖であるによって開発が始められた。その後アップル社内での4年間の開発期間を経て、2014年のWWDCにおいて一般に発表され、同時にアップルに開発者登録している開発者に対してベータ版の提供が開始された。
WWDC 2016の基調講演で、アップルはSwiftでのコード作成方法を教えることを目的とした、Swift Playgroundsという名称のiPad専用アプリ開発を発表した。2016年9月にリリースされたこのアプリは3Dビデオゲームのようなインターフェイスで表示され、コードの行が特定の順序で配置され実行されたときにフィードバックを提供する。2017年3月21日、Swift 3.1に対応し、日本語を含め5カ国語に対応したことを発表。Swift 3.1は、2017年3月27日にリリースされた。
2017年現在、Project Leadは、Chris Lattner同様にLLVMとClangの開発者である、AppleのTed Kremenekである。
2017年9月19日、Xcode 9.0とともにSwift 4がリリースされた。
2018年3月29日、Xcode 9.3とともにSwift 4.1がリリースされた。
2018年6月4日、Xcode 10 betaとともにSwift 4.2がリリースされた 。
アップルはSwiftの発表に際して「モダン、安全、高速、インタラクティブ」を大きな特徴として挙げた。
定数はcodice_1キーワードで、変数はcodice_2キーワードによって宣言する。変数は値の再代入が可能だが、定数は後から値を変更することはできない。
Swiftでは型推論が可能な場合には型の記述を省略できる。
Swiftの真偽値はcodice_3型であり、codice_4とcodice_5どちらかの値をとる。
符号付き整数の型には、codice_6、codice_7、codice_8、codice_9、codice_10がある。codice_6は、32ビット環境ではcodice_9と同じサイズ、64ビット環境ではcodice_10と同じサイズである。
符号無し整数の型には、codice_14、codice_15、codice_16、codice_17、codice_18がある。codice_14は、32ビット環境ではcodice_17と同じサイズ、64ビット環境ではcodice_18と同じサイズである。
浮動小数点の型には、IEEE 754 単精度codice_22と、倍精度のcodice_23がある。
いかなる数値型の変数についても暗黙の型変換(cast)が行われることはなく、型の違う数値同士の演算、右辺と左辺で型の異なる代入は全てコンパイルエラーとなる。codice_9型からcodice_10型への変換や、64ビット環境におけるcodice_10型からcodice_6型への変換など、非破壊的な変換においても暗黙の型変換が行われることはない。一方、数値リテラルについては、整数型から浮動小数点型への暗黙の型変換が行われることがある。
Swiftの文字列はcodice_28型、文字はcodice_29型であり、Unicode文字一つを格納する。Objective-CやJavaやJavaScriptと異なり、UTF-16表現ではサロゲートペアを要する拡張領域の文字も一文字として扱う。
codice_28型の変数は内部的にはCocoa (Foundation) のcodice_31クラスのインスタンスと互換性があり、キャストもしくはcodice_32関数を用いることによりcodice_31クラスのインスタンスメソッドを呼び出すことができる。
Swiftではある型の要素の配列を、codice_34ないしcodice_35と宣言する。どちらも同じ意味であるが、より直感的な後者が推奨されている。 配列内に型が混在する複合型配列は[Any]型となる
配列リテラルはcodice_36と表記され、型は各要素の型より推論される
なお、codice_37は空の配列リテラルであるが、要素の型を何らかの形で指定する必要がある
配列の結合、代入
Swiftにおける連想配列は辞書(Dictionary)と呼ばれる。C++などと同様、Swiftの辞書は総称型であり、キーの型codice_38、値の型codice_39を持つ辞書はcodice_40またはcodice_41と宣言する。Array同様、より直感的な後者が推奨されている。
リテラルはcodice_42と表記する。配列の場合と同様、型推論が効く
codice_43が空の辞書リテラルであるが、キーの型および値の型が指定されている必要がある点は配列と同様である。
通常のクラス、構造体、列挙型、プロトコルの型は名前付き型（named type）と呼ばれ、型の定義と同時にその型名が与えられる。標準ライブラリのIntやStringなども名前付き型である。
それに対して複合型（compound type）とは、それ自体に名前はついておらず、他の型の組み合わせから成り立つ型のことである。複合型にはタプル型と関数型の二種類がある。
タプルは複数の値を一時的にひとつにまとめて扱うための簡易的なデータ構造である。タプルは関数の多値返却などに利用される。
タプル型は括弧"codice_44"を使ってcodice_45の形式で定義し、どのような型同士でも組み合わせることが可能である。
HTTPステータスコードを表現するために、codice_6型とcodice_28型をひとまとめにしたcodice_48型のタプルを使用する例を以下に示す。
これは型推論によって以下のようにも書ける。
代入式で定数または変数に分解することができる。このとき定数／変数名にアンダースコアを指定すると、その値を無視することができる。
タプルの各要素にはあらかじめ名前をつけることができ、その名前によって値に直接アクセスすることができる。また、インデックスを指定することでも値にアクセスできる。
タプル以外の変数も1個のみの値をもつタプルとして設計されている。例えば以下はcodice_49の値を正しく表示する。
関数型はcodice_50で表される。例えば、codice_6型とcodice_23型の引数を1つずつ受け取りcodice_28型の値を返す関数は、codice_54型と表される。詳細は#関数の項を参照。
型エイリアス（type alias）によって、既存の型に別名をつけることができる。型エイリアスの宣言はcodice_55キーワードによって行う。
Perl等と同様に、帰結節や繰り返す文は（ブレースで囲まれた）複文（ブロック）でなければならない。また、Goなどと同様に、条件式を囲む括弧は不要である。
条件式に書けるのはcodice_3型かcodice_3型の式か、codice_58プロトコルを実装する型でなければならない。後者はcodice_59プロパティのcodice_3値が評価される。
C言語と違い、数値だけでなくあらゆるオブジェクトによって分岐することができる。また暗黙的にブレークされ、codice_61キーワードがある場合に限り、次のcase文にフォールスルーする。
for-in文によってコレクションや範囲の要素をイテレートできる。
C言語風のfor文はSwift 3.0で廃止された
上記のコードは範囲(Range)を使ったfor-in文で次のように書ける
Swiftでは2.0でdo-while文がrepeat-whileに変更された。
Swiftでは安全性のため、ある型の定数や変数にcodice_62を代入することは禁止されている。
ある値が存在しないことを示すため変数にcodice_62を代入可能にしたい場合には、codice_64型でラップする。
任意の型のcodice_64型は、ラップしたい型名の後ろに"codice_66"を付けて表す。
codice_67型の値からcodice_68型の値を取り出すことを、アンラップするという。
codice_64型の値をアンラップするには、値のうしろに"codice_70"を付ける。
アンラップする場合には、値が確かに存在すること（codice_62ではないこと）を確認しなければならない。
if文とwhile文ではOptional束縛（optional binding）を記述できる。
上のコードをOptional束縛を利用して書くと次のようになる。
while文で使用するOptional束縛の例を下に示す。
Swiftにおける関数とクロージャは第一級関数であり、普通のオブジェクトと同じように変数に入れたり、引数として受けとったり、戻り値として返すことができる。
関数の定義はcodice_72キーワードを使って以下のように行う。
上の関数はcodice_73型のオブジェクトとして扱うことができる。
関数の引数はデフォルトで定数であり、関数内でその値を変更することはできない。しかしcodice_2キーワードを付けて引数を宣言すると、その引数は関数内で値を変更できるようになる。なお、デフォルト（codice_1）、codice_2どちらで宣言した場合も、引数は値渡し（参照型の引数は参照の値渡し）である。codice_2で宣言した引数に別の値を再代入しても、呼び出し元の変数の値は変わらない。
関数の引数には外部引数名（external parameter name）を指定することができる。対して関数内部のみで使用できる引数名はローカル引数名（local parameter names）と呼ぶ。外部引数名が指定された関数を呼び出すときは、明示的にその名前を記述しなければならない。外部引数名を使うことによって、関数を呼び出す側のコードで引数の意味を明確にすることができる。
外部引数名とローカル引数名が同じならば、引数名の前に"codice_78"を付けた短縮形を使うことができる。
関数の中で関数を定義することが可能である。
引数の型に続けて"codice_79"（ピリオド3つ）を記述すると可変長引数（variadic parameter）となる。可変長引数は関数内では配列として扱うことができる。可変長引数にできるのは一番後ろの引数だけである。
引数には個別にデフォルト値を設定でき、デフォルト値が設定された引数は呼び出す際に省略することが可能となる。
デフォルト値が設定された引数は自動的に名前付き引数となる。
codice_80キーワードを付けて引数を宣言すると、引数に値のコピーが渡り、関数を実行した結果の値がコピーされて呼び出し元に書き戻される、いわゆる値呼びの結果返し（call-by-value-result）となる。Swiftではこれをin-out引数と呼ぶ。呼び出し側ではin-out引数に渡す変数名の前にcodice_81を付ける。なおin-out引数にデフォルト値を設定することはできず、また定数やリテラルなどの値を変更できないものを渡すこともできない。in-out引数はコンパイラによって参照呼び（call-by-reference）に最適化される場合がある。Swift3.0から変更するのはパラメーターではなく型であること、パラメーターラベルの変更との表記上の類似性を避けるということから型の前に置かれるように変更された。
Swiftでは中括弧codice_82で囲まれたコードブロックは事実上全てクロージャとなる。
このとき、引数・戻り値と、本体の処理の間に「codice_83」を書くことで、この2つの部分を区別する。
以下の例は、整数型引数codice_84を持ち、整数の結果（ここではcodice_84の3倍の値）を返すクロージャが使われている。
配列のメソッドcodice_86は、関数もしくはクロージャを引数に持ち、
配列要素の一つ一つにこの関数またはクロージャを適用する機能を持つ。
この例では、codice_87の配列要素がそれぞれ3倍され、codice_88がcodice_89となる。
クロージャを書く場合に、いくつかのオプションがある。
delegateのコールバックのようにクロージャの型が推論可能な場合、
引数の型やクロージャの戻り値の型のいずれかもしくは両方の表記を省略することができる。
例えば上記の例では、引数も戻り値も配列の要素（型はcodice_6）であるので、下のように型の指定を省略できる。
また、クロージャの本体に1文しかない場合は、その値を返すものと考えられ、
以下のように、codice_91文に関係する記述を省略する事ができる。
さらに、引数を文字ではなく数字で表す事でさらに短く表現できる。
クロージャに渡される引数は、順番にcodice_92、codice_93、…で示すこともできる。そこで、以下のようにできる。
また、関数の最後の引数がクロージャであった場合、それを括弧の外に出してもよい。
さらに、この場合、空の括弧、codice_44は省略可能である。
もう一つ別の例を示す。
codice_95関数は、第1引数に配列を、第2引数に並べ替えルールを示す関数もしくはクロージャを書くことで、
配列の要素を並べ替えた新しい配列を返す。
並べ替えルールは、隣接する要素がルールに従っている場合にcodice_4を返す関数である。
配列要素がcodice_6である場合、たとえば、以下のルール関数により、
codice_98という整数配列を昇順に並べ替えることができる。
codice_95関数はcodice_100という配列を返す。ルール関数の部分をクロージャで書くと以下のようになる。
これも、上記のcodice_86メソッドの例と同様に、以下のように簡潔に記述する事ができる。
タイプセーフの共通型を列挙する
Swiftの構造体はC言語の構造体から大きく強化されており、クラスと同様にメソッドやコンピューテッド・プロパティを実装することができる。
クラスと構造体の宣言は、それぞれcodice_102キーワードとcodice_103キーワードを使って次のように行う。
クラスは参照型/ reference typeで、アサインされる時には参照ポインタが渡される。
構造体は値型/ value typeでletやvarでアサインされる時にコピーされる。これに属する物としては、 String　Array Dictionary が有る。
プロパティはcodice_1またはcodice_2を使って、ローカル定数／変数と同じように定義できる。プロパティにアクセスする時はドット記法により行う。
ストアド・プロパティは他言語のインスタンス変数に近いが、遅延初期化や値の監視（後述）など、より高機能である。
ストアド・プロパティは定義の前にcodice_106修飾子を付けることで、初めてアクセスされる時まで初期化の実行を遅らせることができる。
初期値は最初に使われる時まで計算されない。
ゲッター／セッターを介してアクセスするプロパティを定義できる。
他言語の一般的なプロパティに近い。
ゲッターのみを定義すれば読み出し専用のコンピューテッド・プロパティとなる。この場合、codice_107キーワードを省略できる。
プロパティの値がセットされる時に常に動くように監視している。
willset 値が格納される直前に呼ばれる。
didset　値が格納された直後に呼ばれる
普通のプロパティが個々のインスタンスに属するのに対して、同じクラスの全てのインスタンスで共有するプロパティを、型プロパティ（type property）という。他の言語でいうクラス変数に近い。
型プロパティはクラスではcodice_102キーワードを、構造体ではcodice_109キーワードを使って宣言する。
メソッドは特定の型に結びつけられた関数である。
クラス、構造体、列挙型のすべては、
そのインスタンスと共に実行するタスクや機能をカプセル化した
インスタンスメソッドを定義することができる。
クラス、構造体、列挙型は、
型そのものと一緒に実行する
型メソッド（type method）を定義することができる。
型メソッドは他言語のクラスメソッドに近い。
Swiftにおいて構造体と列挙型がメソッドを定義できることは、C言語やObjective-Cとの大きな違いである。
Objective-Cにおいてはクラスがメソッドを定義できる唯一の型であった。
Swiftにおいては、クラス、構造体、列挙型でメソッドを定義できる。
インスタンスメソッドは、特定のクラス、構造体、列挙型のインスタンスに属する関数である。
インスタンスメソッドは、
インスタンスプロパティを読み書きする機能や、
インスタンスの目的に関した機能を提供する。
インスタンスメソッドは、関数とまったく同一の文法で記述される。
インスタンスメソッドは、その型のすべてのインスタンスメソッドとプロパティにアクセスできる。
インスタンスメソッドは、それが記述されている型のインスタンスに対してのみ呼び出すことができる。
インスタンスの指定無しでメソッドだけを単独に呼び出すことはできない。
以下に、整数型の長さの辺を持つ三角形のクラスを定義している（あまり実用的ではないが）。
ここでは、3辺の長さを設定するインスタンスメソッドcodice_110と、
3辺の合計（codice_111）を返すインスタンスメソッドcodice_111を定義している。
インスタンス内の変数には変数名だけでアクセス可能であるが、
とくに区別したい場合は自分自身を表すcodice_113を使用する。
以下の例では、codice_110メソッドで、引数のcodice_49、codice_116、codice_117とインスタンス変数のcodice_49、codice_116、codice_117を区別するためにcodice_113を使用している。
以下では、3辺に3、 4、 5を設定し、周囲長12を表示している。
他言語に対して特徴的な点は、
引数が2個以上のメソッドの呼び出し方法である（例ではcodice_110）。
最初の引数は値のみを記述するが、
2番目以下の引数では、
メソッド定義で仮引数として書かれた変数名にコロンを付けてラベル付けする。
ここでは、第2、3引数に、codice_123とcodice_124のラベルを付けている。
メソッドの2番目以下の引数にラベルを付記する方式は、
セレクタを使用したメッセージ渡しを行うObjective-Cとの整合性を高めるためである。
Smalltalkの流れを汲むObjective-Cでは、これに相当するメソッドは
というように、codice_125、codice_126、codice_127の3個のセレクタで構成されるメッセージで呼び出されるのが通例である。
最初のセレクタをメソッド名に、以降のセレクタをラベルにすることで、
Objective-Cとの共存や、Objective-Cで構築されたフレームワークへのアクセスを実現している。
インスタンスメソッドがある型のインスタンス上で呼ばれるのに対し、型それ自身の上で呼ばれる型メソッドを定義できる。
型メソッドは、クラスの場合はfuncキーワードの前にclassを書いて定義する。
構造体や列挙型の場合はfuncキーワードの前にstaticを書いて定義する。
イニシャライザは、そのクラスのオブジェクトがインスタンス化される際に呼ばれる処理を記述する。他の言語で言うところのコンストラクタに相当する。
codice_128に続けてブロックを記述する。メソッドの定義に似ているがcodice_72キーワードや戻り値の型、codice_91文は書かない。
ひとつのクラスに複数のイニシャライザを記述することができる。
初期化が必要なプロパティのすべてが初期化されることを保証するイニシャライザのことを、指定イニシャライザ（designated initializer）と呼ぶ。さらに、クラスを継承している場合は、指定イニシャライザはスーパークラスのイニシャライザを呼び出さなければならない。
それに対して、プロパティの初期化を他のイニシャライザに委譲するイニシャライザを、コンビニエンス・イニシャライザ（convenience initializer）と呼ぶ。
コンビニエンス・イニシャライザはcodice_128キーワードの前にcodice_132キーワードを置く。
コンビニエンス・イニシャライザの中からコンビニエンス・イニシャライザを呼び出すことは可能だが、最終的には指定イニシャライザが呼び出されるようにしなければならない。
Objective-Cでは指定イニシャライザは規約でしかなかったが、Swiftでは文法として厳密に検査される。
なお、Objective-Cにおいてコンビニエンス・コンストラクタと呼ばれているものは、例えばcodice_31のインスタンス生成にcodice_134と呼ぶところを、codice_135のように短く便利に呼べるようにしたもののことであり、Swiftのコンビニエンス・イニシャライザとは別物である。
引数の無いイニシャライザはデフォルト・イニシャライザ（default initializer）と呼ばれ、明示的に定義されていなくても自動で生成される。
構造体はデフォルト・イニシャライザに加えて、メンバをすべて引数に受けとるイニシャライザ（memberwise initializer）が自動で生成される。
デイニシャライザ（deinitializer）にはインスタンスが破棄される際に実行されるべき処理を記述する（開いたファイルを閉じるなど）。他言語の[[デストラクタ]]に相当する。
codice_136に続けて処理ブロックを記述する。引数、戻り値はともに無い。
イニシャライザと違いデイニシャライザは自動で呼びだされるものであり、自分で呼び出すことはできない。
デイニシャライザはクラスにだけ存在し、構造体には無い。
クラス名の後に"codice_137"を挟んでスーパークラスの名前を記述する。
Swiftは多重継承はサポートしない。
メソッドをオーバーライドする場合は、メソッドの定義にcodice_138属性の指定が必須である。これは意図しないオーバーライドを予防するためである。
なお、Objective-CではNSObjectが全てのクラスの共通の基底クラスであったが、Swiftにはそのような全てのクラスに共通の基底クラスというものは存在しない。
Objective-Cのプロトコルと同様の概念であり、Java言語などのインタフェースに相当する機能である。
Swiftのクラスはエクステンション（extension）を用いて既存のクラスを拡張することができる。これはObjective-Cのカテゴリとよく似ている。
ジェネリック(総称性)コードは、柔軟で再使用可能な関数や型を可能にする。
ジェネリックはSwiftの最も強力な機能の一つでSwiftの標準ライブラリは殆どジェネリックコードで作られている。 配列や辞書型もジェネリック集合である。 IntでもStringでも色んな型を入れる事が出来る。
ジェネリックにすることにより一つの定義であらゆるタイプを取扱う事が出来るようになる。
自分用のジェネリックタイプを定義できる。 それには、カスタムClass、構造/structure、列挙/enumeration 等が配列や辞書と同じ様にどんなタイプとでも動く。
下の例は、自由な型の2つの値を交換する関数である。 Tは架空の型名で実際にはどんな型でも動く。
swapTwoValues関数と Stackタイプはどんな型でも動く。 しかしジェネリック関数やジェネリックタイプで使われるとき、型束縛をして制限した方が使いやすい事がしばしばある。
型パラメータリストの一部として、型パラメータの名前の後ろにコロン:で区切って単一クラスやプロトコル束縛を書いて型束縛とする。
プロトコルを定義する時にいくつかの関連タイプ（別名：alias）を定義した方が使いやすい時が有る。　typealias を使って別名を定義する。
Container プロトコルが ItemTypeと言う関連タイプを持つ例
型束縛にwhereで更なる条件を付ける
Swiftでは任意の型に対して、既存の演算子をオーバーロードして独自の振る舞いを定義することができる。
演算子オーバーロードは通常の関数定義とほとんど同じ形式で定義するが、前置演算子をオーバーロードする場合はcodice_139修飾子を、後置演算子の場合はcodice_140修飾子を、それぞれcodice_72キーワードの前に付ける。複合代入演算子をオーバーロードする場合は、左辺の値を変更するため左辺の引数をin-out引数とする。
なお codice_142 は予約されておりオーバーロードしたりカスタム演算子(後述)として定義することはできない。
Swift標準の定義済み演算子（codice_143、codice_144、codice_145など）の他に、全く新しい演算子を定義することができる。新しく定義したカスタム演算子は、標準の演算子と同じように演算子オーバーロードを実装できる。
カスタム演算子の定義はcodice_146キーワードで行う。さらに、前置演算子ならcodice_139、後置演算子ならcodice_140、中置演算子ならcodice_149修飾子をcodice_146キーワードの前につける。
演算子名に使用できる記号は codice_151 及び数学記号等の一部のユニコード文字の組み合わせに限られる。
中置カスタム演算子を定義する場合、任意でその優先度と結合性を定義できる。
優先度の定義はcodice_152キーワードに続けて、0から255の範囲の整数値で設定する。優先度の定義を省略した場合のデフォルト値はcodice_153である。
結合性の定義はcodice_154キーワードに続けて、左結合ならcodice_155キーワード、右結合ならcodice_156キーワード、非結合ならcodice_157キーワードを記述する。結合性の定義を省略した場合のデフォルト値はcodice_157（非結合）である。
[[カリー化]]関数（Curried Function）は、複数のパラメータを持つ関数 f(a,b)を1つのパラメータを持つ関数 F(a)->g(b) に分解して再定義したF関数の事を言う。
カリー化した後の評価は右から左へ行われる。　カリー化は一つの引数のみを取る複数の関数のラムダ計算等に必要な機能となる
Swiftでは自動参照カウント（Automatic Reference Counting）ARC　でアプリが使うメモリを追跡管理する。
ARCはクラスインスタンスが使われなくなった時に自動的にそれが使っていたメモリを開放する。
Swiftは[[cocoa]]や[[Objective-C]]をシームレスに使えるように設計されている。SwiftとObjective-Cの間はどちらのAPIからでもお互いに使う事が出来る。
モジュールとしてアクセス可能などんなObjective-Cフレームワーク（又はCライブラリ）でもSwiftに直接インポートできる。
初期化の例SwiftからLibcを呼ぶ例
[[Category:プログラミング言語]]
[[Category:オブジェクト指向言語]]
[[Category:MacOS]]
[[Category:IOS (アップル)]]
[[Category:教育用プログラミング言語]]