2016-09-14 96 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 
}