从Swift 2到Swift 3的折旧代码

时间:2017-01-03 21:03:07

标签: xcode swift2 swift3

所以我在youtube上关注了本教程:https://www.youtube.com/watch?v=uUTevJAhL3Q,我无法弄清楚如何将其余部分更新为Swift 3;我在斯威夫特相对较新,并且还在学习,如果有人能帮助我,那将是太棒了!我正在尝试重新创建一个Snapchat相机视图。

import UIKit
import AVFoundation

class CameraVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {


    var captureSession : AVCaptureSession?
    var stillImageOutput : AVCaptureStillImageOutput?
    var previewLayer : AVCaptureVideoPreviewLayer?
    @IBOutlet var cameraView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        previewLayer?.frame = cameraView.bounds
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        captureSession = AVCaptureSession()
        captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080

        var backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

        var error : NSError?
        var input = AVCaptureDeviceInput(device: backCamera, error: &error)

        if (error == nil && captureSession?.canAddInput(input) != nil){

            captureSession?.addInput(input)

            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG]

            if (captureSession?.canAddOutput(stillImageOutput) != nil){
                captureSession?.addOutput(stillImageOutput)

                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect
                previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait
                cameraView.layer.addSublayer(previewLayer!)
                captureSession?.startRunning()

            }


        }


    }
    @IBOutlet var tempImageView: UIImageView!


    func didPressTakePhoto(){

        if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo){
            videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait
            stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: {
                (sampleBuffer, error) in

                if sampleBuffer != nil {


                    var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                    var dataProvider  = CGDataProvider(data: imageData as! CFData)
                    var cgImageRef = CGImage(jpegDataProviderSource: dataProvider, decode: nil, shouldInterpolate: true, intent: kCGRenderingIntentDefault)

                    var image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Right)

                    self.tempImageView.image = image
                    self.tempImageView.isHidden = false

                }


            })
        }


    }


    var didTakePhoto = Bool()

    func didPressTakeAnother(){
        if didTakePhoto == true{
            tempImageView.isHidden = true
            didTakePhoto = false

        }
        else{
            captureSession?.startRunning()
            didTakePhoto = true
            didPressTakePhoto()

        }

    }

    func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        didPressTakeAnother()
    }

}

1 个答案:

答案 0 :(得分:1)

Swift 3引入了error handling的想法,并且大多数(如果不是全部)Apple的Foundation和Core API都得到了更新,以便不使用read_data_sets()参数捕获错误方法one_hot=True和错误。

所以你以前用这样写的代码:

inout &error

在Swift 3中更新以删除错误参数,并使用新的throwsvar error : NSError? var input = AVCaptureDeviceInput(device: backCamera, error: &error) do语法:

try

如果您愿意,可以使用简写版本:

catch

下次您从Swift 2转换为Swift 3时,请尝试使用Xcode&#39; refactor&#39;它可以很好地为您自动进行这些更改。