快速获取条件绑定的错误初始化程序必须具有可选类型,为啥?

Posted

技术标签:

【中文标题】快速获取条件绑定的错误初始化程序必须具有可选类型,为啥?【英文标题】:swift getting error initializer of conditional binding must have optional type, why?快速获取条件绑定的错误初始化程序必须具有可选类型,为什么? 【发布时间】:2017-02-01 22:42:05 【问题描述】:

我正在使用 swift 和 cloudkit 尝试从 cloudserver 获取图像,如下所示,我收到错误:“条件绑定的初始化程序必须具有可选类型而不是 CKAsset”:if let ckAsset = image 请帮忙,因为我是 swift 新手,这是我的第一个应用程序

 let ckRecord = Saveddata[indexPath.row]
    weak var weakCell = cell
    backgroundQueue.addOperation 
        let image = ckRecord.object(forKey: "Photos") as! CKAsset

        if let ckAsset = image 
            if let URL = ckAsset.fileURL 
            let imagedata = NSData(contentsOf: URL)
            OperationQueue.main.addOperation() 
                cell.imageView?.image = UIImage(data: imagedata! as Data)
                

        

        

【问题讨论】:

每当您使用if let 时,= 的右手应该是一个可选。但是image 不是并且是可选的。因为:在使用as! CKAsset 强制展开图像之前的行中 那么我如何执行相同的逻辑并强制图像成为 CKAsset 如果您收到该错误:请勿使用if let。只需使用let。尽管最好使用guard 而不是整个强制展开 使用守卫见here 【参考方案1】:

我认为您正在寻找的是:

let ckRecord = Saveddata[indexPath.row]
weak var weakCell = cell
backgroundQueue.addOperation 
    let image = ckRecord.object(forKey: "Photos")

    // Conditionally cast image resource
    if let ckAsset = image as? CKAsset 
        // This isn't optional, no protection needed
        let url = ckAsset.fileURL

        // Data(contentsOf:...) will throw on failure
        do 
            // Fetch the image data (try because it can fail and will throw if it does)
            let imagedata = try Data(contentsOf: url)
            OperationQueue.main.addOperation() 
                weakCell?.imageView?.image = UIImage(data: imagedata)
            
        
        catch 
            // handle data fetch error
        
    

它有条件地将资源转换为CKAsset,并且仅在它实际上是一个时才继续。

【讨论】:

@rania 或者你的意思是这也很有意义 可能是真的,有足够多的东西丢失/未定义,我刚刚解决了他抱怨的明显问题。 @david Berry 我相信是的-但现在我在第二行有同样的错误:如果让 URL = ckAsset.fileURL 我应该挂在:如果让 URL = ckAsset.fileURL 为?网址 fileUrl 不是可选的,你不需要if let URL

以上是关于快速获取条件绑定的错误初始化程序必须具有可选类型,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

条件绑定的初始化程序必须具有可选类型,而不是“Bool”-firebase

ios:条件绑定的初始化程序必须具有可选类型,而不是“LOTAnimationView”

条件绑定的初始化程序必须具有可选类型,而不是“UIView”

条件绑定的初始化程序必须具有可选类型,而不是“AVAudioInputNode”