【Swift】個人的に使っている便利なextensionたち

# 前書き
Swiftにはextensionというものが存在し、これを使うことでよりクラスを改造しコーディングを楽にすることができます。
実装するには後述するコードをコピぺするだけです。

全てまとめたものを[こちら](https://github.com/YoshihisaTanaka-prog/ExtensionTest/blob/main/ExtensionTest/Extensions.swift)で配布しています。ご自由にお使いください。

~~詳しく知りたい方は[extensionについてのこちら]()の記事（未作成）を読んでみてください。~~

元々のアイデアは[こちら](https://qiita.com/nakau1/items/bac828533c7db6eacf78)から得ました。

# 目次
* [型変換シリーズ](#型変換シリーズ)
* [アラートシリーズ](#アラートシリーズ)

# 本題
## 型変換シリーズ
例えば、Int型からString型に変換する場合、本来なら「String(〇〇)」というふうに書かないといけないものを「〇〇.s」というふうに略記することができるようになります。

* Int型にする　→　hoge.i
* Double型にする　→　hoge.d
* CGFloat型にする　→　hoge.cg
* String型にする　→　hoge.s

という仕様にしました。

~~~Extensions.swift
extension Int{
//    String(hoge)をhoge.sでもできるようにする
    var s: String{
        return String(self)
    }
//    Double(hoge)をhoge.dでもできるようにする
    var d: Double{
        return Double(self)
    }
//    CGFloat(hoge)をhoge.cgでもできるようにする
    var cg: CGFloat{
        return CGFloat(self)
    }
}

extension Double{
//    String(hoge)をhoge.sでもできるようにする
    var s: String{
        return String(self)
    }
//    String(format: "%.2f", hoge)などをhoge.s("%.2f")などでもできるようにする
    func s(_ format: String) -> String{
        return String(format: format, self)
    }
//    Int(hoge)をhoge.iでもできるようにする
    var i: Int{
        return Int(self)
    }
//    CGFloat(hoge)をhoge.cgでもできるようにする
    var cg: CGFloat{
        return CGFloat(self)
    }
}

extension String{
    var i: Int?{
        return Int(self)
    }
    
    var d: Double?{
        return Double(self)
    }
}
~~~

## アラートシリーズ

本来であればアラートを表示させるために長いコードを書かなければならないですが、メッセージを表示させるだけのアラートなどを簡略化させるextensionを作ってみました。
<table>
  <caption>こういうふうな使用にしました。</caption>
  <thead>
    <tr>
      <th>やりたいこと</th> <th>コード</th> <th>補足説明</th>
    </tr>
  </thead>
  <tr>
    <td> メッセージの表示 </td> <td>showMessageAlert(title: タイトルを入力, message: メッセージを入力)</td><td></td>
  </tr>
  <tr>
    <td> OKボタン付きのアラートの表示 </td> <td>showOkAlert(title: タイトルを入力, message: メッセージを入力) {<br>&nbsp;&nbsp;&nbsp;&nbsp;OKボタンが押された時の処理<br>}</td><td></td>
  </tr>
  <tr>
    <td>OKボタンとCancelボタン付きのアラートの表示</td><td>showOkCancelAlert(title: タイトルを入力, message: メッセージを入力) {<br>&nbsp;&nbsp;&nbsp;&nbsp;OKボタンが押された時の処理<br>} canceledFunc: {<br>&nbsp;&nbsp;&nbsp;&nbsp;Cancelボタンが押された時の処理<br>}</td><td></td>
  </tr>
  <tr>
    <td> 任意のアラートの表示 </td> <td>
        showAlert(title: タイトルを入力, message: メッセージを入力, actionDictionary: [ボタンのテキスト: {処理内容}])</td><td>Dictionary型引数のkeyをボタンに表示する内容、valueをそのボタンがタップされた時の処理というふうにします。</td>
  </tr>
  <tr>
    <td> キャンセル付きの任意のアラートの表示 </td> <td>
        showCancelAlert(title: タイトルを入力, message: メッセージを入力, actionDictionary: [ボタンのテキスト: {処理内容}]){<br>&nbsp;&nbsp;&nbsp;&nbsp;Cancelボタンが押された時の処理<br>}<br></td><td>上に同じ</td>
  </tr>
</table>

~~~Extensions.swift
extension UIViewController{
    func showAlert(title: String?, message: String?, actionDictionary: Dictionary<String, () -> Void >){
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for elem in actionDictionary{
            let key = elem.key
            let function = elem.value
            let action = UIAlertAction(title: key, style: .default) { (action: UIAlertAction) in
                function()
            }
            alert.addAction(action)
        }
        present(alert,animated: true, completion: nil)
    }
    
    func showCancelAlert(title: String?, message: String?, actionDictionary: Dictionary<String, () -> Void >, canceledFunc: @escaping () -> Void){
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        for elem in actionDictionary{
            let key = elem.key
            let function = elem.value
            let action = UIAlertAction(title: key, style: .default) { _ in
                function()
            }
            alert.addAction(action)
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { _ in
            canceledFunc()
        }
        alert.addAction(cancelAction)
        present(alert,animated: true, completion: nil)
    }
    
    func showMessageAlert(title: String?, message: String?){
        showAlert(title: title, message: message, actionDictionary: ["OK": {}])
    }
    
    func showOkAlert(title: String?, message: String?, okFunc: @escaping () -> Void){
        showAlert(title: title, message: message, actionDictionary: ["OK": okFunc])
    }
    
    func showOkCancelAlert(title: String?, message: String?, okFunc: @escaping () -> Void, canceledFunc: @escaping () -> Void){
        showCancelAlert(title: title, message: message, actionDictionary: ["OK": okFunc], canceledFunc: canceledFunc)
    }
}
~~~