【Swift】Swiftがこんなに使われる理由

本記事は、swiftって何をするための言語？swiftを使うメリットは？
というプログラミング初心者向けの記事になります。

###<目次>

- 1. swift とは
- 2. swift の特徴


#1. Swift とは

SwiftはiOS、macOS向けアプリケーションの開発言語として
Appleが発表したプログラミング言語です。
swiftの発表後に登場したwatchOSやiPadOSにも対応しています。

**iOS**
-> iPhoneに搭載されているOS(オペレーティングシステム)
**macOS**
-> macに搭載されているOS(オペレーティングシステム)
世の中には、他にもWindows や Linux 、 Android などといった様々なOSが存在します。


#2. Swift の特徴

swiftは、様々な人や企業が利用しています。
当たり前ですが、利用される多くの理由があるからです。

swiftには様々な特徴が存在するのでそれについて紹介していきます。

##2-1. 静的型付き言語

静的型付き言語とは、コンパイル時などの実行前の段階で変数や定数の型を決定するプログラミング言語のことです。
もちろん実行するまで変数の型が決まっていない動的型付き言語も存在します。

もちろんどちらの言語体系にもメリット・デメリットは存在しますが、
今回は静的型付き言語のメリットのみ紹介します。

静的型付き言語の最大のメリットといえば,
誤った型の値の代入などがコンパイルエラーとして検出されるため、
実行時のエラーの一部を未然に防げるというところです。

```swift


var a: Int      //変数はInt型

a = 1000        //Int型の代入はコンパイルエラーは発生しない。
a = "こんにちは"   //String型の代入はコンパイルエラーが発生する。
```

上記のようなわかりやすいミスはほぼ起こりえませんが、
コードを書いている上で型の違いは稀に起こります。

実行後にエラーが発生し、アプリが強制終了してから型の不一致に気づくようでは、
機能が完成してから間違いに気づくようなものです。

型が違うだけで多くのコードを書き直さなければならない可能性も出てきます。
そうなると機能の再設計をしなければならない場合も...。

それを未然に防ぐことが出来るのが静的型付き言語の最大の特徴とも言えると思っています。


##2-2. nilの許容性をコントロールすることが出来る

まずはじめに、nilとは何も値が存在しないことを示すものです。
別のプログラミング言語だとnullやnoneのような、別の名前で存在することもあります。

多くのプログラミング言語では、
値が存在しない状態や参照先が存在しない状態を表す際に使われてきました。

一方で、nilが存在するが故に実行時エラーを招いてしまうという問題もありました。
(nilは厄介なことに、コンパイル時にエラーが発生しませんでした。)

しかし、そのような問題を回避するために、
**Swiftでは基本的にはnilを変数や定数に代入出来ないようになっています。**

ですが、nilを許容する特別な型の変数や定数にのみnilを代入出来る仕様になっています。

nilを代入出来る型と、代入出来ない型の違いは次のようになります。

```swift


var a: Int    //nilを代入するとエラーが起きる

var b: Int!   //nilを代入してもエラーが起きない
var c: Int?   //nilを代入してもエラーが起きない 
```

このように型の最後に ! や　? を付けることによりnilを許容するInt型になります。
オプショナル型などと呼ばれるのですが、それについては後日記事にします。

この状態で、print()というメソッドを使用すると下記のようになります。

```swift


print(a)    //nilを許容出来ないInt型なのに値が入っておらずコンパイルエラーが発生する

print(b)    // nil
print(c)    // nil
```

一時的に変数の中に値を入れたくない場合などは ! や ？ をつけておくのがいいかもしれません。


##2-3. 型推理による簡潔な記述が可能

この機能は個人的にかなり便利だなと思いました。

swiftの変数や定数には、Int型やString型など様々な方があるのですが、
型推理という仕組みが導入されているため明示的に型を宣言する必要がありません。

つまり、どういうことかというと

```swift


var a: Int   // Int型
var b = 10   // Int型
var c = "こんにちは"  // String型
```

このように、aのように明示的にInt型と宣言しても平気ですし、
bのように10という値(Int型の値)のみを入れても自動的にInt型ということになります。

##2-4. ジェネリクスによる汎用的な記述が可能

ジェネリクス・・・？
ワタシ、ヨコモジ、キライ・・・。

少し調べてみたのですが、
なんでも**特定の型に制限されない汎用的なプログラミングを書くための機能**だとか。

通常のプログラミングでは、関数の引数は
Int型やString型などの予め決められた型以外の引数を渡すことは出来ません。

しかし、ジェネリクスを使用したプログラミングなら
様々な型を引数として渡すことが可能になります。

今回は引数でもらった値をprintで出力する関数を作成したとします。

```swift


func printParameters<T>(_ x: T,_ y: T){
    print(x)
    print(y)
}

printParameters(1,22)     // 1 と 22 が表示されます。
printParameters("こんにちは","さようなら")     // こんにちは と さようなら が表示されます。
printParameters(10,"こんにちは")    // 型引数:T は同じ型を受け取るので Int型とString型を引数にするとエラーが発生する
```

このように、同じ関数でも様々な型を使用することが出来るのがジェネリクスになります。
また、_(アンダースコア)には引数名を使用しないという特別な意味があります。

##2-5. Objective-Cと連携可能

iOS,macOS向けのアプリケーション開発には、今まではObjective-Cが採用されていました。

アプリケーションを開発するために使用するフレームワークは、
macOS向けのCocoa、iOS, watchOS, tvOS向けのCocoa Touch が提供されています。

Cocoaの大部分はObjective-Cで記載されているため、
Objective-Cと高い互換性を持っているswiftはCocoaの利用も可能となっています。

これまで使用してきたObjective-Cのコードはほぼ全てswiftで使用可能なので、
Objective-Cでサービスを作った企業もswiftへの段階的な移行は楽ですね！



これから新しい言語が出た時は、
swiftから楽に移行できる仕様になっていると嬉しいですね！

以上、最後まで読んでいただきありがとうございました。