Swift(一人)AdventCalendar最終日なのでSwiftの好きな所を20個ほどあげてみる

この記事はSwift(一人)AdventCalendarの最終日の記事です。
最終日はSwiftの良い事を書いて終わりたいのでSwiftで気に入っている事を書いていこうと思います。

思いついたものを書いていくので小ネタが多かったり粒度が違ったりしますがご容赦下さい。

## 1. 配列周りのメソッドの充実
Swiftでは配列周りのメソッドが非常にしています。
それに加えてブロック構文が書きやすくなっているので配列の操作が非常に簡単です。

```objc
// 60未満の数字を取り出し、それをソートする
[[@[@10, @80, @43, @82, @10] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self < 60"]] sortedArrayUsingComparator:^ NSComparisonResult(id number1, id number2) {
    return [number1 intValue] - [number2 intValue];
}];
```

```swift
// 60未満の数字を取り出し、それをソートする
[10, 80, 43, 82, 10].filter { $0 < 60 }.sort { $0 < $1 }
```

メソッドの詳細な使い方は下記事が分かりやすかったです。

[Swiftのmap, filter, reduce（などなど）はこんな時に使う！](http://qiita.com/mo_to_44/items/cf83b22cb34921580a52)

## 2. ヘッダーファイルがない
ファイル数が2分の1になってありがたいです。

## 3. importが不要
「新しいクラスを使いたい」→「一番上までスクロールして#import文を書く」→「元の位置どこだっけ」という事がなくなって快適です。

## 4. @が不要
文字列・配列・ディクショナリーの定義が楽になりました。

```
文字列: @"" → ""
配列: @[] → []
ディクショナリー: @{:} → [:]
```

余談ですが@で始めるものはコンパイラディレクティブと呼ばれるようです。
http://www.atmarkit.co.jp/ait/articles/0809/09/news142.html

## 5. Switch文のbreakが不要
break入れ忘れがなくなりました。

## 6. セミコロンが不要
地味ですが嬉しいです。

## 7. 文字列操作が楽
文字列埋め込み・文字列連結・文字列比較が楽になりました。

```objc
NSString *str1 = @"文字列A";
NSString *str2 = @"文字列B";
[NSString stringWithFormat:@"%@", str1]; // 文字列埋め込み
[str1 stringByAppendingString:str2]; // 文字列連結
[str1 isEqualToString:str2]; // 文字列比較
```

```swift
let str1 = "文字列A"
let str2 = "文字列B"
"\(str1)" // 文字列埋め込み
str1 + str2 // 文字列連結
str1 == str2 // 文字列比較
```

## 8. 配列やディクショナリーにIntやFloatを入れれるようになった
Objective-cであった「intをNSNumberに変換して配列に格納、取り出す時はNSNumberからintに変換。」という作業が不要になったのはありがたいです。

## 9. 配列やディクショナリーにnilを入れれるようになった
NSNullにハマった人は多いはず。

## 10. ブロック構文の簡潔さ
1と被るのですがブロック構文は型推論や省略形が多く使えて簡潔に書けるようになりました。

以前の記事でもまとめたので宜しければご一読下さい。

[Swiftのブロックの省略形](http://qiita.com/shimesaba/items/e8772923e860da765dc8)

## 11. Enumへのメソッド追加
EnumにメソッドやComputed Propertyを追加できるようになりました。
そのオブジェクトに関連するプロパティーや処理をenum中に書けるのでコードの見通しが良くなりました。

```swift
enum Color {
    case Blue
    case Red
    case Green
    
    var colorCode: String {
        switch self {
        case .Blue:  return "0000FF"
        case .Red:   return "FF0000"
        case .Green: return "00FF00"
        }
    }
}
```

他にも元プリミティブ型(Int・Floatなど)のものへもメソッド追加できるようになっています。

## 12. 型推論の導入
型推論でかなり変数の宣言が見やすくなりました。
特にUIKitは長いクラス名が多いので型情報を省略するとかなりすっきりします。

```objc
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"" forIndexPath:indexPath];
```

```swift
let cell = tableView.dequeueReusableCellWithIdentifier("", forIndexPath:indexPath)
```

Enumも見やすく書けるようになりました。

```objc
cell.accessoryType = UITableViewCellAccessoryCheckmark;
```

```swift
cell.accessoryType = .Checkmark // UITableViewCellAccessory.Checkmarkの省略形
```

## 13. letの導入
letの導入によって積極的にImmutableな変数を使うようになり、以前より安全なアプリが作れるようになった気がします。
これについてはプログラムを書く際の意識が変わった事が大きいと思います。

## 14. デフォルト引数の導入
Swiftではデフォルト引数を使う事ができるようになりました。
ラベルのおかげで好きな位置の引数を省略する事ができ、柔軟な使い方ができます。

```swift
func method(value1: Int = 0, value2: Int = 1, value3: Int = 2) {}
method(value2: 10)
```

以前の記事でもデフォルト引数について書いたので宜しければご一読下さい。

[【Swift】デフォルト引数を活かして堅牢なアプリケーションを作る](http://qiita.com/shimesaba/items/c8bd51fb2740419bbe7b)

## 15. 名前空間の導入
名前空間が導入された事で、クラス名が被っても問題なくなりました。
これによってクラス名に`NSxxx`といったプレフィックスを付ける必要がなくなりました。

## 16. ProtocolExtension
Swift2.0から追加されたProtocolExtensionによってRubyのmix-inのような事を実現できるようになりました。
その辺りについては以下の記事が分かりやすかったです。

[Swiftのprotocol extensionでmixin的なものを実現する](http://qiita.com/sagaraya/items/5e73501ff7a3f0c502c0)

## 17. クラス中でenumやclassの定義ができる
クラス中にenumやclassの定義ができる事でそのクラスに関連するものを集約させる事ができるようになりました。

```swift
class User {
    enum Status {
        case Active
        case Deleted
    }
}
```

## 18. 自分で作ったクラスに関する演算子
自分で作ったクラスを使った演算子が簡単に定義できるようになりました。

```swift
class MyClass {}
func ==(lhs: MyClass, rhs: MyClass) -> Bool { return true }
```

独自演算子では以前の記事でも書いているので宜しければご一読下さい。

[Swiftの演算子を理解する](http://qiita.com/shimesaba/items/cb36c0120a0a9f509da7)

## 19. willSet/didSetの導入
willSet/didSetが導入された事でプロパティーセットのタイミングに処理を入れる事ができるようになりました。

```swift
class MyClass {
    var prop: Int = 0 {
        willSet {}
        didSet {}
    }
}
```

## 20. Optional型の導入
Optional型の導入によって値がnilを取りうるかが簡単に判別できるようになりました。
これによってnilチェックの回数が減った事も大きいのですが、それ以上にライブラリを使う事が楽になった事が大きいです。
これによってnilを許可しないメソッド引数にnilを渡してエラーが起きたりメソッドがnilを返し得る事に気付かず不具合が起きる事がなくなりました。

## まとめ
長くなりましたがSwiftの気に入ってる点を20個ほど上げてみました。
Swiftは非常に好きな言語なので、この記事読んで共感してもらたりSwiftへの興味を持ったりしてもらえたらうれしいです。