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 语法,这在可能的情况下并没有太大帮助,但那是完全不同的事情。)
之后错误消失了...
在 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 语法,这在可能的情况下并没有太大帮助,但那是完全不同的事情。)
之后错误消失了...