2017-07-14 33 views
0

在斯威夫特4游乐场验证码:过滤字典在Xcode中失败,但成功在游乐场

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。这是一个测试¯\_(ツ)_/¯类的事情,还是我错过了什么?

+0

我无法重现相同的结果。在用Xcode 9 beta 3创建的一些项目中,您的代码编译时没有问题,并生成您期望的输出。你的环境中有什么特别的东西? – OOPer

+0

嗯。我无法想象如此。尽我所知,我正在使用Xcode的完全香草安装。感谢您确认它在您的最终编译。我会看看我能否弄清楚发生了什么事。 – Subject22

回答

0

我想这个解决一些方法,包括重新启动的Xcode,清除DerivedData等,但在当时没有奏效。几天后我又回到了这个项目,发现之前编译的代码现在没有问题(没有做过任何相关的修改)。所以我将这归咎于Xcode 9 beta的一个怪癖。或者,也许某些东西只是被粘在某个地方,Xcode最终清除了一个缓存或者其他类似的东西。 ¯\_(ツ)_/¯

3

您在使用雨燕3.2,而不是斯威夫特4.

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

enter image description here

摘录下从基金会的文档进行更改: 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或更高版本

+0

没有。绝对使用Swift 4.虽然好想法。 – Subject22

+0

好吗?你有没有尝试在一个新的空项目上使用该代码?在这里工作得很好,你描述的错误只出现在目标的快速朗读时。版本设置为3.2 – nathan

+0

100%确定。但是,既然你把它恢复了起来,我只是试着把代码从上面粘贴回到它以前失败的同一个项目中,现在它的构建很好。我100%确定我没有改变任何可能会有所作为的东西,所以我会把这归咎于某种测试怪癖。感谢您花时间帮助:) – Subject22

0

今天我有同样的问题。

我的项目是用xCode 8.x在Swift 3.x中创建的。升级到xCode 9后,它一直工作正常,直到今天'filter is unavailable'错误启动。

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

这个诀窍 - 这对我来说是 - 转换为整个项目为Swift 4

(我用的开始与编辑迁移工具/转换/到目前雨燕的语法,这是不是在5月的情况下太大的帮助,但是这是一个完全不同的事情。)

的错误走后。 ..