swift 无法在当前上下文中推断闭包类型

7lrncoxx  于 2023-02-21  发布在  Swift
关注(0)|答案(3)|浏览(251)

在下面函数的第3行,我得到了以下错误:
无法在当前上下文中推断闭包类型
我该怎么解决这个问题?

func fetchAllUsersImages() {
    print("inside func")
    self.ref.child("Posts").child(self.userID).child(self.postNum).observe(.childAdded, with: { snapshot in //error here

        var images: [URL] = []
        if let snapShotValue = snapshot.value as? [String: String] {

            for (_, value) in snapShotValue {
                if let imageURL = URL(string: value) {
                    print(imageURL, "image url here")
                    let imageAsData = try Data(contentsOf: imageURL)
                    let image = UIImage(data: imageAsData)
                    let ImageObject = Image()
                    ImageObject.image = image
                    self.arrayOfImgObj.append(ImageObject)
                    self.tableView.reloadData()
                }
            }
        }
    })
}
eiee3dmh

eiee3dmh1#

它不推断闭包类型的原因是因为try语句没有被处理,这意味着闭包应该"catch"错误,但是在您的例子中,您忘记了do-try-catch规则。
因此,您可以尝试以下答案,这将捕获您的错误:

do {
    let imageAsData = try Data(contentsOf: imageURL)
    let image = UIImage(data: imageAsData)
    let ImageObject = Image()
    ImageObject.image = image
    self.arrayOfImgObj.append(ImageObject)
} catch {
    print("imageURL was not able to be converted into data") // Assert or add an alert
}

然后,您可以Assert错误(用于测试),或者我个人会做的是设置警报。
这样应用就不会崩溃,而是会通知用户。我发现这在我的设备没有插电的情况下非常有用--这样我就可以看到错误消息,而不是一个空白的崩溃,不知道发生了什么。

u4vypkhs

u4vypkhs2#

如果闭包体中有不相关的编译错误,也会发生这个错误。例如,你可能试图比较两个或更多的非布尔类型。

extension Array where Element == Resistance {
    init(_ points: [Point]) {
        let peaks = points.beforeAndAfter { (before, current, after) -> Bool in
            before < current && current > after
        }
        self = []
    }
}

将产生Unable to infer closure type in the current context
正确代码:

extension Array where Element == Resistance {
    init(_ points: [Point]) {
        let peaks = points.beforeAndAfter { (before, current, after) -> Bool in
            before.value < current.value && current.value > after.value
        }
        self = []
    }
}
puruo6ea

puruo6ea3#

除了ScottyBlades的回答之外,我还想在“体验”中添加两个数据点。看起来编译器没有很好地处理在块中使用self引用不存在的属性。
块内的漂亮错误:

// Setting a handler for an NWListener instance:
self.nwListener?.newConnectionHandler = { (_ connection: NWConnection) -> Void in
    // Results in "Cannot find 'nonExistentProperty' in scope" 
    // in the line below:
    guard let delegate = nonExistentProperty else { return }
}

奇怪的“表达式类型不明确,没有更多上下文”错误:(注意nonExistentProperty前面的新self

// Setting a handler for an NWListener instance:
// Results in "Type of expression is ambiguous without more context" 
// at the equals sign below:
self.nwListener?.newConnectionHandler = { (_ connection: NWConnection) -> Void in
    guard let delegate = self.nonExistentProperty else { return }
}

相关问题