将字典映射到数组到字符串

时间:2019-01-17 13:59:57

标签: swift higher-order-functions

我正在处理一个字典,我需要将其解析为字符串以创建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""

1 个答案:

答案 0 :(得分:4)

您可以使用一个compactMap,因为首先您需要filter Dictionary来仅保留true的值,然后您需要{ {1}}返回与map值相对应的key。但是,您始终可以将随后的truefilter调用合并为一个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,其中元组将由键值对组成。