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

18

在下面的函数的第三行,我遇到了以下错误:

无法推断出当前上下文中的闭包类型

我该如何修复这个问题?

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()
                }
            }
        }
    })
}

我不确定您所说的更改内容是什么...是哪一个?而且您提到的另一篇文章,我并不确定如何应用它。 - user10497264
让imageAsData = try Data(contentsOf: imageURL)似乎因某种原因导致了这个问题@George_E - user10497264
我写了以下代码: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转换为数据") }它可以正常工作,您可以自行验证。 - user10497264
我已经使用了那个注释,并且解释了为什么它没有起作用-这是一个非常常见的错误,非常容易犯。遗憾的是,Swift并不能给出最有用的错误提示...例如,由于同样的问题,我曾经有过类似“值太模糊”的错误,只是因为它无法检测到我没有使用 do-try-catch - George
3个回答

11

它没有推断闭包类型的原因是因为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
}
你可以断言一个错误(用于测试),或者我个人会这样做,设置一个警告。这样应用程序就不会崩溃,而是通知用户。当我外出时,发现设备没有插上电源时,我发现这非常有帮助-这样我可以看到错误消息,而不是一片空白的崩溃,不知道发生了什么。

未处理try语句导致了这个错误的发生? - user10813210
@Outsider 你需要使用 do-try-catch 模式。如果 try 没有捕获错误,那么就会出现语法错误。在这种情况下,Xcode无法检测到语法错误的具体位置。 - George

7

如果闭包体中存在与编译无关的错误,也可能导致此错误。例如,您可能尝试比较两个或多个非布尔类型。

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

会产生无法在当前上下文中推断闭包类型的错误。
正确的代码:

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 = []
    }
}

1
除了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 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接