Webエンジニアに知ってほしいSwiftのスゴいところ5選

macOSやiOS、watchOSといったApple製OSは、Swiftという言語で開発できます。Swiftは他言語の長所を取り入れた新しい言語であり、普段JavaScript等のWeb開発言語を扱っている方ならば、比較的学びやすいものとなっています。今回は、ActionScriptやJavaScript(TypeScript)といった**Web開発用言語と比べて、Swiftの便利な点**を紹介していきます。
以下、JS=JavaScript(TypeScript)、AS3=ActionScript 3.0と表記します。

#ここがスゴイよSwift言語
##1. switch文のbreak宣言が不要
バグの原因を追っていくと、switch文のbreakを一つだけ忘れ、予期せぬ分岐に入っているのを見かけたことがよくあります。Swiftの場合はそんな心配はありません。**case節にはbreakは必須ではない**のです。

```swift:Swift
let randomNum:Int = Int(arc4random() % 3);

switch randomNum {
    case 0:
        print("ラーメン");
    case 1:
        print("うどん");
    default:
        print("とんかつ");
}
```

Swiftを書いた後にJavaScriptを書こうものなら、「 **かぁーーっ！  Swiftの癖でswitchのbreak忘れてたよ！Swiftの癖でっ！かぁーーっ！！**」と地獄のミサワ風に叫ぶことがよくあります。

##2. 桁の多い数字の指定がわかりやすい
「1000」と「10000」はパッと見て見分けがつきにくいです。ゲームアプリを作っていて、ユーザーの得点を1万点にするつもりが、1千点にしてしまえばそれだけで大クレームです。Swiftでは**アンダーライン(_)で数字を区切ることができる**ので、桁の多い数字の見分けがつきやすくなります。

```swift:Swift
1_000     // 千
10_000     // 1万
```

##3. 外部引数名で大量の引数も楽々管理
外部引数名は、大量の引数を必要とする関数を定義するときに便利な機能です。例えば6個の引数をhoge()メソッドに定義するとき、JSでは下記のような指定をします。

```javascript:JS
function hoge(height, weight, sex, blood, name, married) {}
```

このメソッドを呼び出すとき、下記のよう6個の引数を指定します。何番目が何の引数なのかは一目ではわかりません。引数の数が増えれば増えるほど、 **「何番目に何の引数があるのか」を判断する作業は単調で複雑で面倒でバグの温床**です。(~~こんな大量の引数のメソッドを定義しやがって！誰が定義したんだ！私か！と一人悶々としている経験がよくあります~~)

```javascript:JS
hoge(172, 56, 0, 3, "Taro", false);
```

Swiftには外部引数という便利な機能があり、何番目が何の引数であるかが一目でわかるようになっています。例えば上記のhoge()メソッドは次のように定義できます。

```swift:Swift
func hoge(height:Int, weight:Int, sex:Int, blood:Int, name:String, married:Bool) {}
```

この関数を呼び出すには、下記のようにそれぞれ**第1引数以外の引数名を指定しなければならない**ので、どれがどの引数なのかが明確にわかります。

```swift:Swift
hoge(172, weight: 56, sex: 0, blood: 3, name: "Taro", married: false);
```

※ 第一引数も指定必須にする場合は` func hoge(height height:Int, ~` という風に、第一引数の前に引数名を指定します。


##4. タプルは関数の戻り値として大活躍
「タプル」は複数の値を同時に扱うための仕組みです。複数の値を同時に定義することができ、ラベルを指定して参照することができます。もちろん、Xcodeによるコード補完も効きます。

```swift:Swift
// タプルの定義
let ippudo = (
    name: "一風堂",
    level: 5,
    place: "渋谷"
);

// 値の参照
ippudo.name;  // 一風堂
ippudo.level; // 5
```

筆者がJS・AS3のObjectよりもSwiftのタプルの方が便利なのは、**関数で複数の値を返したい時にタプルを設定できる点**です。例えば下記のようにタプルを返す関数を定義してみましょう。

```swift:Swift
func getShopData() -> (name:String, level:Int)
{
    return (name: "一蘭", level: 99)
}
```

これを呼び出すには下記のようにします。

```swift:Swift
let ichiran = getShopData();

ichiran.name;    // 一蘭
```

関数getShopData()の戻り値は(name:String, level:Int)のタプルなので、Xcodeのコード保管もきちんと効きます。AS3やJSでObjectを戻り値にした場合はこうはいきません。もちろん、AS3・JSでもクラスを戻り値にすれば同じことはできますが、タプルはわざわざクラスを作るまでもないときに重宝します。

![タプルでコード保管](https://qiita-image-store.s3.amazonaws.com/0/67884/f3079093-15a4-1c01-88ce-d1a5b52717c8.png "スクリーンショット 2015-12-17 18.26.21.png")

##5. 一度慣れるともう手放せなくなるオプショナル型
Swiftを学ぶときに大きな壁となるものの一つに「オプショナル型」があります。誤解を恐れずに言えば、オプショナル型とは「通常の型に加えて、nil（AS3・JSでいうnull）を取りうる型」のことです。

```swift:Swift
let hoge:Int = nil; // Int型の為エラー

let fuga:Int? = nil; // オプショナルInt型の為エラーではない
```

AS3やJSでコードを書いている時、予期せずnullの値を操作してしまってバグを生んだことはありませんか？ Swiftのオプショナル型はこれを防ぐために導入されました。アンラップ、オプショナルバインディング等AS3・JSには無い独特の記述方法がありますが、一度慣れてしまうとこれまでよりも**予期せぬnil(null)に悩まされることが減ります**。

オプショナル型については下記の記事が大変わかりやすいです。
[SwiftのOptional型を極める - Qiita](http://qiita.com/koher/items/c6f446bad54442a28bf4)


##おまけ. コードに対する警告がいい感じにしつこい
Swift言語というよりはXcodeの機能なのですが、コードに誤りや不正があるときの警告がいい意味でしつこいです。

例えば使用しない変数を定義したり、
![使用しない変数定義](https://qiita-image-store.s3.amazonaws.com/0/67884/ea1fe388-7194-6beb-07ec-fb47fe098624.png "スクリーンショット 2015-12-17 19.23.20.png")

let宣言でいいところをvar宣言していたり、
![let宣言の推奨](https://qiita-image-store.s3.amazonaws.com/0/67884/c29be2db-c784-e012-071d-2810f7faf5a8.png "スクリーンショット 2015-12-17 19.28.28.png")

Swiftのバージョンアップで使用しなくなったメソッドを使用しようとしていたり、
![廃止されたメソッドの使用](https://qiita-image-store.s3.amazonaws.com/0/67884/86e0dd0c-8f31-cdec-3309-f326fb5a93eb.png "スクリーンショット 2015-12-17 19.29.27.png")

あらゆる場面で~~しつこくて煩わしいほどに~~警告と解決案を表示してくれるので、適切なコーディングが楽になります。

#まとめ：Swiftは楽しい
筆者は普段、AS3でモバイルアプリを作ったり、JS(主にTypeScript)でWebサイトを作ったりしていますが、「SwiftのこういうところがAS3・JSにあったら嬉しい」と感じたり、逆に「これはAS3・JSの方が使いやすい」と感じる時もあります。そういった**いろんな言語の違いを感じることができるのも、Swiftを勉強することの楽しみの一つ**です。是非Swiftを使いこなして、Web開発者としてもアプリ開発者としてもレベルアップしていきましょう。

なお、ICS MEDIAでもSwiftの入門記事を連載しておりますので、よろしればこちらもご覧くださいませ。
[Swiftの入門記事連載 - ICS MEDIA](https://ics.media/tutorial-swift)