我正在尝试对一个对象数组进行排序,该对象数组在"MM-DD-YYYY“的from中有一个字符串日期字段和一个布尔值字段。我想创建一个同时按日期字段和布尔值字段对数组进行排序的函数。我很难弄清楚该怎么做。done字段默认设置为false,并且在我的init函数中不需要。
var items = [BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-14-2017"),BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-11-2017"), BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017")]我研究了.sort函数,但我不知道如何比较日期,因为它们是字符串格式的,我也不知道如何按两个字段而不是一个字段排序。我想要排序,以便如果布尔值为true,则它自动小于布尔值字段为false的项。如果两个布尔值都为false,则按日期排序。
发布于 2017-02-16 01:30:45
我将创建一个Date的internal扩展,它定义了一个接受字符串的初始化器,并将其解析为Date。您可以在整个模块中使用它来根据项目选择的日期字符串格式来解析日期。
import Foundation
internal extension Date {
init(_ s: String) {
let df = DateFormatter()
df.dateFormat = "MM-d-yyyy"
guard let date = df.date(from: s) else {
fatalError("Invalid date string.")
}
self.init(timeIntervalSince1970: date.timeIntervalSince1970)
}
}然后,我将修改您的结构以存储Date,而不是String。当然,修改初始化器以匹配。
let items = [
BucketItem(
title: "blah",
des: "description",
lat: 134.6, lon: 27.0,
date: Date("02-14-2017")
),
BucketItem(
title: "blah",
des: "description",
lat: 134.6, lon: 27.0,
date: Date("02-11-2017")
),
BucketItem(
title: "blah blah",
des: "description",
lat: 134.6, lon: 27.0,
date: Date("02-9-2017")
]在这里,您拥有了Comparable Date实例,您可以在排序中使用这些实例。要了解如何根据多个条件进行排序,请参阅my answer here。下面是粗略的代码:
extension BucketItem: Equatable {
static func ==(lhs: BucketItem, rhs: BucketItem) -> Bool {
return lhs.isDone == rhs.isDone
&& lhs.date == rhs.date
// && lhs.foo == rhs.foo
// ...and so on, for all criteria that define equality of two BucketItems
}
}
func <(lhs: Bool, rhs: Bool) -> Bool {
return !lhs && rhs // false is less than true
}
extension BucketItem: Comparable {
static func <(lhs: BucketItem, rhs: BucketItem) -> Bool {
// First sort by isDone
if (lhs.isDone != rhs.isDone) { return lhs.isDone < rhs.isDone }
// else if (lhs.foo != rhs.foo) { return lhs.foo < rhs.foo }
// ...and so on, for all sort criteria
else (lhs.date != rhs.date) { return lhs.date < rhs.date }
}
}
letsortedItems = items.sorted()发布于 2017-02-16 01:48:44
您可以将BucketItem定义为
struct BucketItem {
let title: String
let des: String
let lat: Double
let lon: Double
let dat: String
let someBoolValue : Bool
var date: NSDate {
get {
return BucketItem.dateFormatter.dateFromString(dat)!
}
}
static let dateFormatter: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "MM-dd-yyyy"
return formatter
}()}
然后在数组上调用排序方法
var items = [BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-14-2017", someBoolValue: false),BucketItem(title: "blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-11-2017", someBoolValue :true), BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017",someBoolValue: false), BucketItem(title: "blah blah", des: "description", lat: 134.6, lon: 27.0, dat: "02-9-2017",someBoolValue: true)]
items.sortInPlace{
if $0.date != $1.date {
return $0.date.compare($1.date) == NSComparisonResult.OrderedAscending
}
else {
return !$0.someBoolValue && $1.someBoolValue
}
}https://stackoverflow.com/questions/42255683
复制相似问题