swift - 学习 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
任何想法为什么它会失败?
解决方案
从 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
推荐阅读
- c# - c# microsoft.graph SDK 将消息复制到另一个邮箱
- php - 如何在路由中选择一个 id 将其传递到控制器并针对该 id 获取数据并在 laravel 5.6 中再次重定向它
- python - AttributeError:模块“多处理”没有属性“事件”
- amazon-web-services - API 网关 URL 路径参数未通过
- ios - 无法从 XCode 9.2 上所需的二进制 CoreLocation.framework 进行符号化
- mysql - 如何让 Django 模型中的 id 自动增加 2?
- android - 混淆(minifyEnabled true)在调试和发布中不起作用
- c# - 在多个 OR 条件下连接表
- c# - 识别 IEnumerable 是否已排序的方法
- powershell - IE 浏览器 - Powershell 脚本将站点添加到受信任站点列表、禁用保护模式并降低所有区域的安全级别