【Swift】アプリ開発をする際に便利だった自作メソッド

# はじめに
最近ようやくExtensionの使い方がわかってきたので、自分の脳内整理も含めてこの記事を書きます。
あと、この記事は初心者による初心者のための記事なので、ある程度Swiftできるよって人にとって有用な情報はほぼないと思います。

### エラーを知らせるアラート
```swift
extension UIViewController{
    func showErrorAlert(title: String, message: String, actionTitle: String){
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        let okAction = UIAlertAction(title: actionTitle, style: .default) { action in
            alert.dismiss(animated: true)
        }
        alert.addAction(okAction)
        self.present(alert, animated: true)
    }
```
エラーのタイトル、メッセージ、アクションボタンのタイトルを入れてあげればすぐにエラーの表示を行えます。実際のユーザーに使ってもらう時ってよりも、テストユーザーにテストしてもらうときにどこでエラーが起きたのかテストユーザーにも伝えやすいって点で便利でした。

### ActivityIndicatorを表示する
```swift
extension UIView{

    func showIndicator(color: UIColor) -> UIActivityIndicatorView{
        var activityIndicator: UIActivityIndicatorView!
        activityIndicator = UIActivityIndicatorView()
        activityIndicator.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
        activityIndicator.hidesWhenStopped = true
        activityIndicator.style = .large
        activityIndicator.color = color
        self.addSubview(activityIndicator)
        activityIndicator.startAnimating()
        
        return activityIndicator
    }
}
```
`UIActivityIndicator`はロード中とかを表すクルクルするアレです。以下みたいに使用してました。
```swift: ViewContorller
import UIKit
import Firebase

class ViewController: UIViewController{
    @IBOutlet var label: UILabel!

    @override func viewDidLoad{
        super.viewDidLoad()
        
        //labelに文字が表示されるまでIndicatorを表示させる
        let activityIndicator = label.showIndicator(color: .white)

        let db = Firestore.firestore()
        db.collection("Memo").whereField("title", isEqualTo: "sport").getDocuments{ memoSnaps, error in
            if error != nil{
                print(error)
                //Indicatorを止める
                activityIndicator.stopAnimating()
            }else{
                memoSnaps.documents.forEach{memoSnap in
                    let memoDic = memoSnap.data()
                    let memoData = Memo(dic: memoDic)
                    self.label.text = memoData.memo
                }
                //Indicatorを止める
                activityIndicator.stopAnimating()
            }
        }
    }
}
```
Firebaseでデータをロードしている間はクルクルを表示させるようにしています。自動で止める方法はわからなかったので、止める時だけ手動で止めてます。

### URLから画像を表示する
```swift
import UIKit
import KingFisher

extension UIImageView{
    func setImageFromURL(url: String){
        //上記のshowIndicator
        let avtivityIndicator = self.showIndicator
        
        if url == ""{
            activityIndicator.stopAnimating()
            self.image = UIImage(systemName: "person")
        }else{
            let url = URL(string: url)
            KingfisherManager.shared.downloader.downloadImage(with: url!){result in
                switch result{
                case .success(let value):
                    activityIndicator.stopAnimating()
                    self.image = value.image
                case .failure(let error):
                    print(error)
                    print("画像の読み込みに失敗しました")
                    activityIndicator.stopAnimating()
                    self.image = UIImage(systemName: "person")
                }
            }
        }
    }
}
```
URLから画像データを読み込むのには`KingFisher`を使用しています。
上記の`ActivityIndicator`と組み合わせて、画像データをロードしている間はクルクルを表示し、画像が表示できたらクルクルを止めるようにしています。

```swift
@IBOutlet var imageView: UIImageView!

imageView.setImageFromUrl(url: "https://misoshiru.oishii")
```
みたいな感じで使用してました。

## 終わりに
いろんなメソッドを自分の作るプロダクトに合わせて作ってると思いますが、上記のメソッドは大抵のアプリでは有用なんじゃないかなと思います。
こう書けばもっと良くなるとか、こんなメソッドもあるとか、間違ってる箇所あるとかありましたら是非教えてください。