首页 > 解决方案 > 将 Swift 3 函数转换为 Swift 4

问题描述

我正在努力将此功能转换为 Swift 4

func buildIndex(records: [Record]) -> [[Record]] {
    var g = [NSDate: [Record]]()
    for e in records {
        if (g[e.time] == nil) {
            g[e.time] = []
        }
        g[e.time]!.append(e) // grouping by `time`
    }
    return sorted(g.keys) { (a: NSDate, b: NSDate) in
        a.compare(b) == .OrderedAscending // sorting the outer array by time
    }
    // sorting the inner arrays by `name`
    .map { sorted(g[$0]!) { $0.name < $1.name } } 
}

我希望有一个人可以帮助我。

标签: swift

解决方案


这里有很多东西要清理。变量名显然是一场灾难,但强制展开也是如此。所有这些都可以用一个简单的调用来代替Dictionary.init(grouping:by:)

import Foundation

struct Record {
    let time: Date
    let name: String
}

func buildIndex(records: [Record]) -> Any {
    return Dictionary(grouping: records, by: { $0.time })
        .mapValues { $0.sorted { $0.name < $1.name} }
        .sorted { (pair1, pair2) in pair1.key < pair2.key }
}

推荐阅读