我目前正在尝试将一些Swift 2代码移植到Swift 3.0。
以下是一行令我疯狂的代码。
public private(set) var searchHistory: [SearchHistoryEntry] = [SearchHistoryEntry]() // Struct that is cComparable
....
...
searchHistory.sortInPlace({ $0.lastUsage.isAfter($1.lastUsage) })
这是我的Swift 3.0版本
searchHistory.sort(by:{ $0.lastUsage.isAfter($1.lastUsage) })
lastUsage属于日期
编译器抱怨以下错误消息
参数传递给不带参数的调用
任何想法我做错了什么? 我真的不明白编译器想要讲什么。 排序需要一个块,我通过它,一切都应该没问题。
更新
我发现了错误。 Swift将所有NSDate属性转换为Date,我们在NSDate上获得了名为 isAfter 的扩展。所以编译器找不到isAfter了。编译器错误消息完全是误导性的。
答案 0 :(得分:1)
我会使用sorted(by: )
即
searchHistory.sorted(by: {$0.lastUsage > $1.lastUsage})
完整的工作示例:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM-dd-yyyy"
struct ExerciseEquipment
{
let name: String
let lastUsage: Date
}
let myExerciseEquipment =
[
ExerciseEquipment(name: "Golf Clubs", lastUsage: dateFormatter.date(from: "03-16-2015")!),
ExerciseEquipment(name: "Tennis Racket", lastUsage: dateFormatter.date(from: "06-30-2003")!),
ExerciseEquipment(name: "Skis", lastUsage: dateFormatter.date(from: "02-08-2017")!),
ExerciseEquipment(name: "Hockey Stick", lastUsage: dateFormatter.date(from: "09-21-2010")!),
ExerciseEquipment(name: "Mountain Bike", lastUsage: dateFormatter.date(from: "10-30-2016")!)
]
print(myExerciseEquipment.sorted(by: {$0.lastUsage > $1.lastUsage}))
...结果
[ExerciseEquipment(姓名:“Skis”,lastUsage:2017-02-08 05:00:00 +0000),ExerciseEquipment(名称:“Mountain Bike”,lastUsage:2016-10-30 04:00:00 +0000),ExerciseEquipment(名称:“Golf Clubs”,lastUsage: 2015-03-16 04:00:00 +0000),ExerciseEquipment(名称:“曲棍球棒”, lastUsage:2010-09-21 04:00:00 +0000),ExerciseEquipment(名称:“网球 Racket“,lastUsage:2003-06-30 04:00:00 +0000)]
答案 1 :(得分:1)
刚出现同样的错误。我之前在Swift中的代码是:
let sorted = array.sorted {
$0.characters.count < $1.characters.count
}
然而,它不再起作用了。看起来他们已使用[{1}}
的参数更新了sorted()
以下对我有用:
sorted(by: )