【Swift5】iPhoneの画像を読み込み、UIImageViewに表示する

初心者が実装できるとちょっぴり嬉しいポイントだと思うので、備忘録として記載します。

# 環境
- X-code10.2
- Swift5
- 対象OS 12.0

# 1.info.plistに登録する

Listに```NSPhotoLibraryUsageDescription```のキーを追加し、
Valueにカメラロールの使用目的を記載します。

<img width="713" alt="スクリーンショット 2019-04-14 18.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/17d319d6-477e-66ac-02f4-6c7d2ba638b9.png">


# 2.実装する

<img width="759" alt="スクリーンショット 2019-04-14 18.17.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/f5fc4058-6649-93ee-2149-b83e76d69011.png">

部品はStoryBoardに適当に配置しました。

```ViewController.swift 
import UIKit

final class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView! {
        didSet {
            // デフォルトの画像を表示する
            imageView.image = UIImage(named: "no_image.png")
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func selectPicture(_ sender: UIButton) {
        // カメラロールが利用可能か？
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            // 写真を選ぶビュー
            let pickerView = UIImagePickerController()
            // 写真の選択元をカメラロールにする
            // 「.camera」にすればカメラを起動できる
            pickerView.sourceType = .photoLibrary
            // デリゲート
            pickerView.delegate = self
            // ビューに表示
            self.present(pickerView, animated: true)
        }
    }
    
    @IBAction func deletePicture(_ sender: UIButton) {
        // アラート表示
        showAlert()
    }
    
    /// アラート表示
    func showAlert() {
        let alert = UIAlertController(title: "確認",
                                      message: "画像を削除してもいいですか？",
                                      preferredStyle: .alert)
        let okButton = UIAlertAction(title: "OK",
                                     style: .default,
                                     handler:{(action: UIAlertAction) -> Void in
                                        // デフォルトの画像を表示する
                                        self.imageView.image = UIImage(named: "no_image.png")
        })
        let cancelButton = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
        
        // アラートにボタン追加
        alert.addAction(okButton)
        alert.addAction(cancelButton)
        
        // アラート表示
        present(alert, animated: true, completion: nil)
    }
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    // 写真を選んだ後に呼ばれる処理
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        // 選択した写真を取得する
        let image = info[.originalImage] as! UIImage
        // ビューに表示する
        imageView.image = image
        // 写真を選ぶビューを引っ込める
        self.dismiss(animated: true)
    }
}
```

初回起動画面はこんな感じ
![IMG_9846.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/0dbffea4-f38a-ae2b-92f9-a2c1f8041c84.png)


「写真を選択」ボタンを押下するとカメラロールが表示されます
![IMG_9838.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/4efee998-9ada-5d0e-e216-c6260e8d34f2.jpeg)


選択した画像がUIImageViewに表示されます
![IMG_9848.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/be1a8eed-27d2-2ad0-9453-d6fd6ba693b9.png)


 「写真を削除」ボタンを押下し、OKボタンを選択すると画像が削除されます
![IMG_9849.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186535/1b275c44-23a7-3a2e-45fb-cd1a384cefdc.png)


表示するだけならとても簡単みたい！


ご指摘などあれば、コメントお願いいたします。


# 参考
- https://theswiftdev.com/2019/01/30/picking-images-with-uiimagepickercontroller-in-swift-5/
- http://www.cl9.info/entry/2017/07/17/173803
- https://stackoverflow.com/questions/51182701/how-do-i-use-the-updated-uiimagepickercontrollerdelegate-ios-12-api