【问题标题】:How do I iterate through an array of [Dictionary<String, String>] dictionaries in swift?如何快速遍历 [Dictionary<String, String>] 字典数组?
【发布时间】:2020-02-02 05:26:04
【问题描述】:

我有一个字典数组,设置如下:

var tableViewData: [Dictionary<String, String>] = []

如果我打印 tableViewData,它看起来像这样:

[["End Time": "01:31 PM", "Date": "09-25-2019", "Duration": "23", "Start Time": "01:08 PM"], ["Start Time": "01:31 PM", "End Time": "01:54 PM", "Duration": "23", "Date": "09-25-2019"]]

我已经枚举并使用了一个 for 循环,但我似乎无法让数据以我想要的方式出现。

我已尝试关注有关堆栈溢出的这些其他问题,但我认为他们的数据设置方式与我的完全不同

How do I iterate through a [String:[String]] Dictionary in Swift

Swift for loop: for index, element in array?

我的目标是只提取每一行的值条目,以便保存到 CSV。

我希望它看起来像这样:

Date, Start Time, End Time, Duration    
09-25-2019, 01:08 PM, 01:31 PM, 23
09-25-2019, 01:31 PM, 01:54 PM, 23

【问题讨论】:

    标签: arrays swift string dictionary


    【解决方案1】:

    您应该构建您的数据,并使其符合 Codable。

    Xcode 11 • Swift 5.1

    struct Event: Codable {
        let date, startTime, endTime, duration: String
        private enum CodingKeys: String, CodingKey {
            case date = "Date", startTime = "Start Time", endTime = "End Time", duration = "Duration"
        }
    }
    

    然后您可以简单地创建一个只读计算属性来从事件集合中创建自定义字符串:

    extension Collection where Element == Event {
        var csv: String {
            "Date, Start Time, End Time, Duration\n" +
            map {"\($0.date), \($0.startTime), \($0.endTime), \($0.duration)\n"}.joined()
        }
    }
    

    游乐场测试:

    let tableViewData = [["End Time": "01:31 PM", "Date": "09-25-2019", "Duration": "23", "Start Time": "01:08 PM"], ["Start Time": "01:31 PM", "End Time": "01:54 PM", "Duration": "23", "Date": "09-25-2019"]]
    
    do {
        let data = try JSONSerialization.data(withJSONObject: tableViewData)
        let events = try JSONDecoder().decode([Event].self, from: data)
        print(events.csv)
    } catch {
        print(error)
    }
    

    这将打印出来

    日期、开始时间、结束时间、持续时间

    2019 年 9 月 25 日,下午 1:08,下午 1:31,23

    2019 年 9 月 25 日,下午 1:31,下午 1:54,23

    【讨论】:

    • 所以这很好用,绝对解决了我的问题。有没有办法处理 let events = try! 的 nil 值? JSONDecoder().decode([Event].self, from: data)?例如,如果我的标题行有一个不在其他行中的附加项目怎么办。或者如果有一个没有设置值的键?
    • @kiddslopp 您可以创建可选属性以根据需要添加任意数量的附加字段。顺便检查一下我的更新。使用 do try catch 并处理解析数据时可能遇到的任何错误。如果不查看您的传入数据(它是 JSON 吗?),除此之外很难为您提供任何帮助。随时针对您的尝试和您面临的问题提出一个新问题。
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2015-05-19
    • 2013-01-28
    • 2014-09-16
    • 2018-08-07
    相关资源
    最近更新 更多