我正在处理一个字典,我需要将其解析为字符串以创建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""
答案 0 :(得分:4)
您可以使用一个compactMap
,因为首先您需要filter
Dictionary
来仅保留true
的值,然后您需要{ {1}}返回与map
值相对应的key
。但是,您始终可以将随后的true
和filter
调用合并为一个map
,因为compactMap
仅保留compactMap
的值,因此不必返回布尔值作为对于non-nil
,如果条件满足,则返回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
,其中元组将由键值对组成。