首页 > 解决方案 > 学习 Swift 闭包 - 对数组进行排序

问题描述

我正在努力学习 Swift。我将通过https://docs.swift.org/swift-book/LanguageGuide/Closures.html试图理解和适应。我正在尝试编写自己的排序函数:按名称长度排序,然后按字母排序。这就是我想出的 - 但它没有正确排序:

let names = ["Chris D", "Alex Greenwalt", "Ewa McCormac", "Gustav Ganz", "Anna Ärliger", "Barry White, MD", "Daniella"]
var sortedNames = names.sorted(by: { s1, s2 in
    if s1.count < s2.count {
        return true
    } else {
        return s1 > s2
    }
})
for name in names {
    print("Unsorted: \(name) is \(name.count) long")
}
for name in sortedNames {
    print("Sorted: \(name) is \(name.count) long")
}

我得到了这个输出,它显然已经通过了一些排序,但不是我想要的:

Unsorted: Chris D is 7 long
Unsorted: Alex Greenwalt is 14 long
Unsorted: Ewa McCormac is 12 long
Unsorted: Gustav Ganz is 11 long
Unsorted: Anna Ärliger is 12 long
Unsorted: Barry White, MD is 15 long
Unsorted: Daniella is 8 long
Sorted: Daniella is 8 long
Sorted: Gustav Ganz is 11 long
Sorted: Ewa McCormac is 12 long
Sorted: Chris D is 7 long
Sorted: Barry White, MD is 15 long
Sorted: Anna Ärliger is 12 long
Sorted: Alex Greenwalt is 14 long

任何想法为什么它会失败?

标签: swiftsorting

解决方案


从 Swift 3 开始,最多 6 个元素的元组是Comparable. 因此,您可以简单地对字符串的计数及其本身进行排序:

let names = ["Chris D", "Alex Greenwalt", "Ewa McCormac", "Gustav Ganz", "Anna Ärliger", "Barry White, MD", "Daniella"]
let sortedNames = names.sorted { ($0.count, $0) < ($1.count, $1) }
for name in sortedNames {
    print("Sorted: \(name) is \(name.count) long")
}

这将打印:

排序:Chris D 长 7
排序:Daniella 长 8
排序:Gustav Ganz 长 11
排序:Anna Ärliger 长 12
排序:Ewa McCormac 长 12
排序:Alex Greenwalt 长 14
排序:Barry White, MD 长 15


推荐阅读