2016-09-14 103 views
3

我使用这段代码:斯威夫特3照片拍摄

func capturePhoto(blockCompletion: @escaping blockCompletionCapturePhoto) { 
    guard let connectionVideo = self.stillCameraOutput.connection(withMediaType: AVMediaTypeVideo) else { 
     blockCompletion(nil, nil) 
     return 
    } 

    connectionVideo.videoOrientation = AVCaptureVideoOrientation.orientationFromUIDeviceOrientation(orientation: UIDevice.current.orientation) 

    self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in 
     if let err = err { 
      blockCompletion(image: nil, error: err) 
     } 
     else { 
      if let sampleBuffer = sampleBuffer, let dataImage = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) { 
       let image = UIImage(data: dataImage) 
       blockCompletion(image: image, error: nil) 
      } 
      else { 
       blockCompletion(image: nil, error: nil) 
      } 
     } 
    } 
} 

它在雨燕2.0工作正常,但转换后它不工作了。 这条线:

self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { (sampleBuffer: CMSampleBuffer!, err: NSError!) -> Void in 

是给我下面的错误:

Cannot convert value of type '(CMSampleBuffer!, NSError!) -> Void' to expected argument type '((CMSampleBuffer?, Error?) -> Void)!'

我已经尝试了一些东西,但不能把它解决。 希望有人能帮助我。

+0

我认为'NSError'得到了重新命名为'Error'斯威夫特3.只需删除'NS',它应该没问题。你是否迁移了你的代码?如果它没有捕捉到它会很奇怪。 – Losiowaty

回答

3

什么错误

Cannot convert value of type '(CMSampleBuffer!, NSError!) -> Void' to expected argument type '((CMSampleBuffer?, Error?) -> Void)!'

基本上说的是,你的论点是错误的类型((CMSampleBuffer!, NSError!) -> Void),而应该是类型((CMSampleBuffer?, Error?) -> Void)!的。

要做到这一点,请尝试使用此代码,它会自动让你的块符合正确的类型:

self.stillCameraOutput.captureStillImageAsynchronouslyFromConnection(connectionVideo) { sampleBuffer, error in 
    //do stuff with your sample buffer, don't forget to handle errors 
} 

它看起来像一个奇怪的类型,但我认为这是一个小错误 - 苹果的地方,而迁移此代码从ObjC到Swift 1到Swift 2到Swift 3.
我还没有测试过这段代码,但我认为它应该可以工作,让我知道它是否真的做到了!

+0

我可以确认这解决了Swift 3中的编译错误 –

2

在swift 3中该命令改变了!

来自:

captureStillImageAsynchronouslyFromConnection 

到:

captureStillImageAsynchronously 

所以试试这个代码:

self.stillCameraOutput?.captureStillImageAsynchronously(from: connectionVideo, completionHandler: { 
     (sampleBuffer, error) in 
    // do your stuff here 
}