我正在处理一个字典,我需要将它解析成一个字符串来为 GraphQL 突变创建一个属性。我的字典是[String: Bool]
,我需要提取设置为true
.
let dict: [String: Bool] = ["Objct1": true, "Objct2": false, "Objct3": true]
目前我正在使用四个函数(过滤器、枚举、映射和连接),虽然我得到了想要的结果,但我想知道我是否需要所有这些:
let string = dict.filter { $0.value }
.enumerated()
.map {
return $0.offset == 0
? "\"\($0.element.key)\""
: ", \"\($0.element.key)\""
}
.joined()
编辑:最后的字符串需要包含在"
:""Objct1", "Objct3""
您可以使用一个单一的compactMap
,因为首先你需要filter
你Dictionary
,只保留true
值,那么你需要map
将返回key
对应的true
值。但是,您始终可以将结果filter
和map
调用合并为单个compactMap
,因为compactMap
只保留non-nil
值,因此您不必像 for 那样返回布尔值filter
,如果您的条件评估为真,则返回您将在 中返回的任何内容map
,否则返回nil
。
let trueKeys = dict.compactMap({key, value in value ? key : nil})
要加入键成一个字符串,你可以调用joined
上的结果compactMap
。
let graphQueryString = dict.compactMap({key, value in value ? "\"\(key)\"" : nil}).joined(separator: ",") // ""Objct3","Objct1""
请记住,您的键的顺序不一定与您声明的 相同Dictionary
,因为Dictionary
根据定义它是一个无序集合。如果要保持排序,可以使用元组数组而不是 a Dictionary
,其中元组将由键值对组成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句