【问题标题】:Swift: dictionary from array of keys and valuesSwift:来自键和值数组的字典
【发布时间】:2021-02-10 02:12:22
【问题描述】:

我需要转换一个键值数组,比如:

["key1", "value1", "key2", "value2"]

进入字典:

{"key1": "value1", "key2": "value2"}

我可以通过两步遍历数组,分别得到 n 和 n+1 作为键和值,但是有什么聪明的方法吗?

谢谢!

【问题讨论】:

  • 你可以更实用,并使用stridemapfilter 等,但你仍然会做同样的“通过两步遍历数组,并得到n 和 n+1 表示键和值”。我认为你不能避免写数字“2”并得到 n 和 n + 1,而不会牺牲很多可读性。

标签: ios arrays swift dictionary


【解决方案1】:

您可以将您的集合分成两个子序列并将它们简化为字典:

extension Collection {
    func unfoldSubSequences(limitedTo maxLength: Int) -> UnfoldSequence<SubSequence,Index> {
        sequence(state: startIndex) { start in
            guard start < self.endIndex else { return nil }
            let end = self.index(start, offsetBy: maxLength, limitedBy: self.endIndex) ?? self.endIndex
            defer { start = end }
            return self[start..<end]
        }
    }
}

let kvs = ["key1", "value1", "key2", "value2"]

let dictionary = kvs
    .unfoldSubSequences(limitedTo: 2)
    .reduce(into: [:]) {
        guard $1.count == 2, let key = $1.first, let value = $1.last else { return }
        $0[key] = value
    }
dictionary  // ["key1": "value1", "key2": "value2"]

另一种使用步幅的方法。这假设您的集合具有偶数个元素:

let kvs = ["key1", "value1", "key2", "value2"]

let dictionary = stride(from: 0, to: kvs.count, by: 2)
    .reduce(into: [:]) { $0[kvs[$1]] = kvs[$1+1] }
dictionary  // ["key1": "value1", "key2": "value2"]

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多