Swift:“数据”类型的值错误以键入“数据”

Posted

技术标签:

【中文标题】Swift:“数据”类型的值错误以键入“数据”【英文标题】:Swift : Error on value of type 'Data' to type 'Data' 【发布时间】:2018-11-15 14:30:22 【问题描述】:

我有一些使用 AVKit 和 AVCapturePhotoCaptureDelegate 的相机功能。

import UIKit 
import AVKit

class CaptureImageClass: NSObject, AVCapturePhotoCaptureDelegate 

    var photoData: Data?

    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) 

        if let error = error 
            print("Error capturing photo: \(error)")
         else 
            photoData = photo.fileDataRepresentation() //Cannot assign value of type 'Data?' to type 'Data?'
        
    

    func capture(_ output: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) 
        guard let photoData = photoData else 
            print("No photo data resource")
            return
        
        let capturedImage = UIImage.init(data: photoData , scale: 1.0) //Cannot convert value of type 'Data' to expected argument type 'Data'
        if let image = capturedImage 
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        
    

当我制作独立项目时,此代码编译没有问题。但是当我尝试申请另一个项目时,它会出现一些错误,例如Cannot assign value of type 'Data?' to type 'Data?'Cannot convert value of type 'Data' to expected argument type 'Data' 这个问题是不是 Swift 版本不同造成的?

注意: 这个“另一个项目”部署目标是 ios 10 和 swift 3 并使用 func capturedidFinishCaptureForResolvedSettings 而不能使用 func photoOutput 我的独立项目使用 Swift 4 运行,部署目标是 iOS 11.3

【问题讨论】:

您是否在某处定义了另一个名为Data 的类型? 【参考方案1】:

检查错误是否不是您设备的iOS版本引起的。

请记住

func photoOutput(_ output: AVCapturePhotoOutput, 
didFinishProcessingPhoto 
photo: AVCapturePhoto, 
error: Error?) 

适用于 iOS11 及更高版本,适用于 iOS10 及更早版本您应该使用

optional func photoOutput(_ output: AVCapturePhotoOutput,
 didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?,
previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
resolvedSettings: AVCaptureResolvedPhotoSettings, 
bracketSettings: AVCaptureBracketedStillImageSettings?, 
error: Error?)

还有

fileDataRepresentation()

适用于 iOS11 及更高版本

希望对你有帮助...

【讨论】:

【参考方案2】:

有人重写了Data 类型。您可以使用以下方法绕过它:

var photoData: Swift.Data?

【讨论】:

【参考方案3】:

通过使用解决 func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, 已解决设置:AVCaptureResolvedPhotoSettings, 括号设置:AVCaptureBrackedStillImageSettings?, 错误:错误?)

    // Make sure we get some photo sample buffer
    guard error == nil,
        let photoSampleBuffer = photoSampleBuffer else 
            print("Error capturing photo: \(String(describing: error))")
            return
    
    // Convert photo same buffer to a jpeg image data by using // AVCapturePhotoOutput
    guard let imageData =
        AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else 
            return
    

    let dataProvider = CGDataProvider(data: imageData as CFData)

    let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.absoluteColorimetric)


    let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right)

    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

【讨论】:

以上是关于Swift:“数据”类型的值错误以键入“数据”的主要内容,如果未能解决你的问题,请参考以下文章

无法分配“NSDictionary”类型的值?键入“字符串?”

尝试在 2 个控制器之间传递数据时,我收到错误无法分配类型“ViewController.Item?”的值键入“项目?”,

错误:无法分配类型“字符串?”的值键入“字符串?。类型”

Java JPA 错误;您试图从查询字符串中设置类型类数据预期类型 int 的值

尝试传递标签的值但收到错误“无法分配类型为“组织?”的值?键入“字符串”

firebase swift 3 转换:无法将类型“(_)->()”的值转换为预期的参数类型“((错误)-> Void)?