【Swift】UIAlertControllerのActionをクロージャで処理したくない

##どういう経緯？
Alertを表示したいプログラムがあったのですが
１・その度にUIAlertControllerを作成するのがいかがなものか？
２．作成する部分をなるべく共通ロジックに移動したい
３．でも共通ロジックにクロージャを渡すのは見苦しくないか？

ということでなんか言語の方針とは違うと思いますがDelegateで処理するようにしました。
（注意）動作検証はしてません



###共通ロジック
```swift:Common.Swift
protocol AlertDelegate{
    func alertClose(alertReturn: Alert.AlertReturn)
}

class Alert{
    enum AlertReturn{
        case Nothing
        case Cancel
        case Value1
        case Value2
        case Value3
    }
    
    struct AlertDefault{
        var title:String = ""
        var alertReturn:AlertReturn? = nil
    }
    
    init(){
        
    }
    
    var delegate:AlertDelegate!
    
    var isHaveCancel:Bool = true;
    var isAlertSheet:Bool = false;
    var title:String = "";
    var message:String = "";
    var preferredStyle:UIAlertControllerStyle = UIAlertControllerStyle.Alert
    
    var defaultVal1:AlertDefault? = nil
    var defaultVal2:AlertDefault? = nil
    var defaultVal3:AlertDefault? = nil
    
    func showAlertController(view:UIViewController){
        var alert:UIAlertController = UIAlertController(title:title,
            message: message,
            preferredStyle: preferredStyle)
        
        if(isHaveCancel){
            let cancelAction:UIAlertAction = UIAlertAction(title: "キャンセル",
                style: UIAlertActionStyle.Cancel,
                handler:{
                    (action:UIAlertAction!) -> Void in
                    println("Cancel common")
                    self.delegate.alertClose(AlertReturn.Cancel)
            })
            
            alert.addAction(cancelAction)
        }
        func addDefault(title:String,alertReturn:AlertReturn){
            let defaultAction:UIAlertAction = UIAlertAction(title: title,
                style: UIAlertActionStyle.Default,
                handler:{
                    (action:UIAlertAction!) -> Void in
                    self.delegate.alertClose(alertReturn)
            })
            alert.addAction(defaultAction)
        }
        
        if(defaultVal1 != nil){
            addDefault(defaultVal1!.title, defaultVal1!.alertReturn!)
        }
        if(defaultVal2 != nil){
            addDefault(defaultVal2!.title, defaultVal2!.alertReturn!)
        }
        if(defaultVal3 != nil){
            addDefault(defaultVal3!.title, defaultVal3!.alertReturn!)
        }
        
        view.presentViewController(alert, animated: true, completion: nil)
    }
    
    
}
```

###使うクラス
・AlertDelegateを実装

```swift:UserAlert.swift
class CameraViewController: UIViewController,AlertDelegate {

    func alertClose(alertReturn: Alert.AlertReturn) {
        switch alertReturn{
        case .Cancel:
            break
        case .Value1:
            println("1")
            break
        case .Value2:
            println("2")
            break;
        case .Value3:
            println("3")
            break;
        default:
            break;
        }
    }
}
```

・呼び出し時

```swift:UserAlert.swift
var alert = Alert()
alert.title = "アラート"
alert.message = "アラートです"
alert.delegate = self
alert.defaultVal1 = Alert.AlertDefault(title: "OK", alertReturn: Alert.AlertReturn.Value1)
alert.showAlertController(self)
```

とりあえずいろいろ試しながら修正していきたいと思います。


##問題点
・複数回同じ画面からAlertを利用する場合にうまいことDelegateの処理が書き分けられない。
・そもそも分かりづらい。


[次⇒【Swift】UIAlertControllerのActionをクロージャで処理したくない2](http://qiita.com/tdaiku/items/d7d9afa06ab9943ed58e)