【问题标题】:Ambiguous use of 'filter' after migration to Swift 4.2迁移到 Swift 4.2 后模糊使用“过滤器”
【发布时间】:2019-11-12 16:53:36
【问题描述】:

我正在努力解决 Dictionary 的以下扩展中的这个小错误。我意识到有一个类似的答案指出在返回变量类型之前声明它可以修复它: Ambiguous use of 'filter' when converting project to Swift 4

但是我不确定“过滤器”类型?任何帮助都会很棒。干杯

func pick(_ keys: [Key]) -> Dictionary {
    return filter { (key: Key, _) -> Bool in
        keys.contains(key)
    }
}

【问题讨论】:

  • 您的代码在 Swift 5.1 中运行良好。也许直接升级到那个版本?
  • 嗯,在修复所有构建错误之前,我无法迁移。
  • 只需注释掉该代码并替换为像return [:] 这样的虚拟实现。
  • 啊,我很想先在 4.2 中修复它,因为现在必须留在这个版本中。它还在错误下说明了这一点。 2. Found this candidate (Swift.Dictionary<Key, Value>)
  • 还有这个候选人:func filter(_ test: (Key, Value) -> Bool) -> Dictionary { var result = Dictionary() for (key, value) in self { if test(key, value) { result[key] = value } } return result }

标签: swift


【解决方案1】:

您已将自己的filter 方法添加到Dictionary,这不是必需的,因为Swift 已经有这样的方法:filter

这个方法好像是在 Swift 4.2 中添加的,这就解释了为什么你之前没有收到错误。由于现在 Swift 已经为你提供了这个方法,你可以放心地删除你写的filter

【讨论】:

    【解决方案2】:

    对于字典,filter 闭包的参数是一个包含键和值的元组。过去总是不能在闭包声明中分离元组的组成部分,而必须自己在主体中进行拆分。

    你可以试试这个:

    func pick(_ keys: [Key]) -> Dictionary 
    {
        return filter { (pair) -> Bool in
            let (key, _) = pair
            return keys.contains(key)
        }
    }
    

    甚至

    func pick(_ keys: [Key]) -> Dictionary 
    {
        return filter{ keys.contains($0.0)}
    }
    
    

    并且您应该删除您对filterDictionary has one built in 的实现,这可能是“歧义使用”错误的原因。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2015-06-24
      相关资源
      最近更新 更多