2017-02-15 85 views
0

我想排序的对象数组中具有“MM-DD-YYYY”和布尔字段的字符串日期字段的对象数组。我想创建一个函数,按日期字段和布尔字段排序数组。我很难弄清楚如何做到这一点。 done字段默认设置为false,并且在我的init func中不需要。通过字符串日期和布尔值排序对象数组IOS

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的项目。如果两个布尔值都是错误的,那么它按日期排序。

+3

上有一个在没有布尔字段中输入您例? –

+0

用正确的dateFormat创建一个DateFormatter,然后'let date0 = dateformatter.date(from:$ 0.dat!)'和'let date1 = dateformatter.date(from:$ 1.dat!)',你的逻辑是什么布尔?这种做法如何? – Larme

+1

可能重复的[Swift - 对多个条件的对象排序数组](http://stackoverflow.com/questions/37603960/swift-sort-array-of-objects-with-multiple-criteria) – Alexander

回答

2

我会创建一个internal扩展Date,它定义了一个接受字符串的初始值设定项,并将其解析为一个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你可以在你的排序中使用的日期实例。要了解如何根据多个条件进行排序,请参阅我的回答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() 
+0

内部扩展是否在定义BucketItem的类中进行? – user4151797

+0

@ user4151797 nope,它不能是 – Alexander

+0

哦,那么你在哪里定义内部扩展? – user4151797

0

您可以定义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 
     } 
    } 
+0

'($ 0.someBoolValue!= $ 1.someBoolValue)&& $ 0.someBoolValue == false'可以是'!$ 0.someBoolValue && $ 1.someBoolValue' – Alexander

+0

另外,我认为最好在初始化程序中使用日期。在BucketItem中添加日期转换使得它不那么灵活;它迫使你使用这种转换。只需要一个'Date'参数,并让消费者按照自己的意愿进行格式化就好多了 – Alexander

+0

@Alexander感谢您的反馈:) –

相关问题