swift QRコード読みとり処理をリーダーとしての組み込むアプリとしての手順

QRコード読みとり処理のサンプルはいくつもありますが、読みとり後の処理に関してあまり例が無いので未熟ながら投稿してっました。
参考になれば幸です。
下記のサイトの読みとり処理にちょっと手を加えスキャン開始から終了後に読みとりデータを表示する様作成してみました。
https://www.hackingwithswift.com/example-code/media/how-to-scan-a-qr-code
１、上記のサンプルよりスキャン後にカメラプレビューを閉じ、読み取った値をテキストエリアに表示する。
![スクリーンショット 2020-05-29 8.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/39fdba1a-3fc4-89df-8294-a379e932fa08.png)

２、スキャンをキャンセルするボタンを表示し、カメラプレビューを閉じ流。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/331e01a5-406f-a8e8-9f5d-14556a1b0173.jpeg" width="30%">

```
import UIKit
import AVFoundation

class ViewController: UIViewController , AVCaptureMetadataOutputObjectsDelegate {
    //キャプチャーの設定
    var captureSession: AVCaptureSession!
    //カメラプレビューの設定
    var previewLayer: AVCaptureVideoPreviewLayer!
   //キャンセルボタンの設定
    var myButton: UIButton!
   //結果表示テキストエリア
    @IBOutlet weak var qrText: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    //開始ボタン内でセッションを定義とスタート
    @IBAction func scanButton(_ sender: Any) {
        
        captureSession = AVCaptureSession()
        
        guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
        let videoInput: AVCaptureDeviceInput
        
        do {
            videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
        } catch {
            return
        }
        
        if (captureSession.canAddInput(videoInput)) {
            captureSession.addInput(videoInput)
        } else {
            failed()
            return
        }
        
        let metadataOutput = AVCaptureMetadataOutput()
        
        if (captureSession.canAddOutput(metadataOutput)) {
            captureSession.addOutput(metadataOutput)
            
            metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            //QRコードタイプのみ設定
            metadataOutput.metadataObjectTypes = [.qr]
        } else {
            failed()
            return
        }
        
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        previewLayer.frame = view.layer.bounds
        previewLayer.videoGravity = .resizeAspectFill
        view.layer.addSublayer(previewLayer)
        
        // UIボタンを作成.
        myButton = UIButton(frame: CGRect(x: 0,y: 0,width: 120,height: 50))
        myButton.backgroundColor = UIColor.red;
        myButton.layer.masksToBounds = true
        myButton.setTitle("キャンセル", for: UIControl.State())
        myButton.layer.cornerRadius = 20.0
        myButton.layer.position = CGPoint(x: self.view.bounds.width/2, y:self.view.bounds.height-50)
        myButton.addTarget(self, action: #selector(ViewController.onClickMyButton(_:)), for: .touchUpInside)
        
        // UIボタンをViewに追加.
        self.view.addSubview(myButton);
        
        captureSession.startRunning()
        
    }
    
    // キャンセル実行でセッション終了しプレビュー閉じる
    @objc func onClickMyButton(_ sender: UIButton){
        self.previewLayer!.removeFromSuperlayer()
        self.captureSession!.stopRunning()
        for output in self.captureSession!.outputs
        {
            self.captureSession!.removeOutput(output as! AVCaptureOutput)
        }
        for input in self.captureSession!.inputs
        {
            self.captureSession!.removeInput(input as! AVCaptureInput)
        }
        self.captureSession = nil
        myButton.removeFromSuperview()
        return
    }
    func failed() {
        let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert)
        ac.addAction(UIAlertAction(title: "OK", style: .default))
        present(ac, animated: true)
        captureSession = nil
    }
    
    //QRコード読み取り処理
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        captureSession.stopRunning()
        
        if let metadataObject = metadataObjects.first {
            guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
            guard let stringValue = readableObject.stringValue else { return }
            AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            found(code: stringValue)
        }
        
        dismiss(animated: true)
    }
    
    //QRコードを読みとった後の処理セッション終了、プレビュー閉じる
    func found(code: String) {
        print(code)
        qrText.text = code
        captureSession.stopRunning()
        previewLayer.removeFromSuperlayer()
        for output in self.captureSession!.outputs
        {
            self.captureSession!.removeOutput(output as! AVCaptureOutput)
        }
        for input in self.captureSession!.inputs
        {
            self.captureSession!.removeInput(input as! AVCaptureInput)
        }
        self.captureSession = nil
        myButton.removeFromSuperview()
    }
    //StatusBarを非表示
    override var prefersStatusBarHidden: Bool {
        return true
    }
    // 回転方向の指定
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
}

```

。