UIAlertControllerをちょっと便利にするヘルパー（.Alert限定）


> ###追記(2015.07.19)
> 新しく記事を投稿しました「SwiftでUIAlertControllerのヘルパーライブラリを書いた」
> http://qiita.com/keygx/items/e3fea65870336fe6b46c

> ###追記(2015.07.17)
> 内容をパワーアップしてライブラリ化しました。
> https://github.com/keygx/AlertHelperKit

####　

UIAlertControllerでのアラート表示をやってくれるヘルパーです。
クリックされたボタン毎に処理を分けたい場合にも対応できます。

```AlertHelper.swift
import UIKit

class AlertHelper: NSObject {

    class func showAlert (title: String?, message: String?, cancel: String?, destructive: [String]?, others: [String]?, parent: UIViewController, callback: (Int) -> ()) {

        // アラート要素が全てnilの場合は中止
        if title == nil && message == nil && cancel == nil && destructive == nil && others == nil {
            return
        }

        // アラート作成
        let alertController = UIAlertController(title: title?, message: message?, preferredStyle: .Alert)

        // キャンセルボタン処理
        if cancel != nil {
            let cancelAction = UIAlertAction(title: cancel!, style: .Cancel) {
                action in callback(0)
            }
            alertController.addAction(cancelAction)
        }

        let destructivOffset = 1
        var othersOffset = destructivOffset

        // Destructiveボタン処理
        if destructive != nil {
            for i in 0..<destructive!.count {
                let destructiveAction = UIAlertAction(title: destructive![i], style: .Destructive) {
                    action in callback(i + destructivOffset)
                }
                alertController.addAction(destructiveAction)

                ++othersOffset
            }
        }

        // その他ボタン処理
        if others != nil {
            for i in 0..<others!.count {
                let otherAction = UIAlertAction(title: others![i], style: .Default) {
                    action in callback(i + othersOffset)
                }
                alertController.addAction(otherAction)
            }
        }

        // アラート表示
        parent.presentViewController(alertController, animated: true, completion: nil)
    }
}
```

##使い方
呼び出し側は、少々長い(引数が多いw)メソッドですが、こんな感じです。
- **アラート内容にあわせて必要な項目を設定**
- **title、message、cancel、destructive、othersが不要な場合はnilも可**
- **destructive、othersは配列で複数設定が可能**
- **キャンセルボタンのbuttonIndexは常に0で、それ以外のボタンについては設定順に1〜を返却**

下記にいくつかの例を挙げます。


##サンプル1
まずは定番の［キャンセル］［OK］パターン。

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/15905/c83300d1-2410-0edf-9791-0ada4e311628.png "screen1.png")


```swift
AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: nil, others: ["OK"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // OK
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}
```

##サンプル2
Destructiveスタイルの場合は下記の通り。

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/15905/a4529535-0719-eaef-72ab-3c01b9f66612.png "screen2.png")


```swift
AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: ["反対"], others: ["賛成"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // 反対
            println("\(buttonIndex)")
            break
        case 2 :
            // 賛成
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}
```

##サンプル3
ボタンタイトルは配列で増やせます。それに合わせて受取側も増やします。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/15905/91577b9a-21c1-c49b-448e-f56c99938579.png "screen3.png")


```swift
AlertHelper.showAlert("アラート", message: "メッセージ", cancel: "キャンセル", destructive: nil, others: ["選択肢1", "選択肢2", "選択肢3"], parent: self) {
    (buttonIndex: Int) in
    // 押されたボタンのインデックスにて処理を振り分ける
    switch buttonIndex {
        case 1 :
            // 選択肢1
            println("\(buttonIndex)")
            break
        case 2 :
            // 選択肢2
            println("\(buttonIndex)")
            break
        case 3 :
            // 選択肢3
            println("\(buttonIndex)")
            break
        default :
            // キャンセル
            println("\(buttonIndex)")
            break
    }
}
```

##サンプル4
ユーザーに確認を促すような、閉じるだけの場合です。

![screen4.png](https://qiita-image-store.s3.amazonaws.com/0/15905/44d84474-1e66-2188-a6ae-2654059f17c1.png "screen4.png")


```swift
AlertHelper.showAlert(nil, message: "メッセージ", cancel: "確認", destructive: nil, others: nil, parent: self) {
    (buttonIndex: Int) in
    // ボタンを押されてもなにもしない
}
```