Swift 4 中的过滤字典在 Xcode 中失败,但在 Playground 中成功

Filtering dictionary in Swift 4 fails in Xcode, but succeeds in Playground

在 Swift 4 Playground 这个代码中:

let time = 1234
let description: String? = nil

let keyed: [String : Any?] = [
    "time": time,
    "description": description
    ]

let filtered: [String : String] = keyed
    .filter{ _, value in value != nil }
    .mapValues { value in return String(describing: value!) }

print(keyed)
print(filtered)

产生这个输出:

["description": nil, "time": Optional(1234)]
["time": "1234"]

这正是我想要的(只有键值对,其中原始值不是 nil,值已展开并转换为字符串)。但是在 Xcode 9(测试版 3)中,我的构建失败并显示 'filter' is unavailable。这是测试版 ¯\_(ツ)_/¯ 之类的东西,还是我遗漏了什么?

您正在使用 Swift 3.2 而不是 Swift 4。

您可以在目标 Build Options > Swift Compiler - Language > Swift Language Version

下进行更改

基金会文档摘录: https://developer.apple.com/documentation/swift/dictionary/2903389-filter?changes=latest_minor

func filter(_ isIncluded: (Dictionary.Element) throws -> Bool) rethrows -> [Dictionary.Key : Dictionary.Value]

Xcode 9.0+

我尝试了几种方法来解决这个问题,包括重新启动 Xcode、清除 DerivedData 等,但当时没有任何效果。几天后我回到该项目,发现以前构建失败的相同代码现在构建没有问题(我没有进行任何相关更改)。所以我将此归咎于 Xcode 9 beta 的一个怪癖。或者也许某些东西只是在某处被粘住并且 Xcode 最终清除了缓存或类似的东西。 ¯\_(ツ)_/¯

我今天遇到了同样的问题。

我的项目是在 Swift 3.x 和 xCode 8.x 中创建的。升级到 xCode 9 后,它一直运行良好,直到今天出现 'filter is unavailable' 错误。

将语言版本明确设置为 Swift 4 并没有解决问题。 (也没有清理项目、重新启动 xCode 等)

对我有用的技巧是 将整个项目转换为 Swift 4.

(我使用迁移工具开始使用 Edit/Convert/To 当前 Swift 语法,这在可能的情况下并没有太大帮助,但那是完全不同的事情。)

之后错误消失了...