【问题标题】:Unable to infer closure type in the current context无法在当前上下文中推断闭包类型
【发布时间】:2019-04-05 04:27:38
【问题描述】:

在下面函数的第 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()
                }
            }
        }
    })
}

【问题讨论】:

  • 我不确定您所说的更改内容是什么意思...是哪一个?以及您所指的其他帖子,我看不出我该如何应用它
  • let imageAsData = try Data(contentsOf: imageURL) 似乎是出于某些原因@George_E
  • 我确实做到了 { 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 convert to data") } 它作为答案提供,我检查它
  • 我使用了该评论并解释了为什么它不起作用 - 这是一个非常常见的错误,这很容易做到。可悲的是 Swift 没有得到最有用的错误......例如,由于同样的问题,我有一个值为 "too ambiguous" 的错误,只是因为它无法检测到我没有 do-try-catch .

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    之所以不推断闭包类型是因为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语句没有被处理会导致这个错误怎么办?
    • @Outsider 您需要使用 do-try-catch 模式。如果try 没有catch 错误,则存在语法错误。在这种情况下,Xcode 只是无法找出语法有什么问题。
    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2017-02-11
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多