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

Posted

技术标签:

【中文标题】无法在当前上下文中推断闭包类型【英文标题】: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 . 【参考方案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 只是无法找出语法有什么问题。

以上是关于无法在当前上下文中推断闭包类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift学习笔记:闭包

Swift 中的尾随闭包语法是啥?

无法使用 SwiftUI 推断复杂的闭包返回类型

在 VStack 中包装 WebView 时出错:无法推断复杂的闭包返回类型;添加显式类型以消除歧义

Swift Combine:无法推断复杂的闭包返回类型错误

无法推断复杂的闭包返回类型;添加显式类型以消除歧义