2017-02-15 86 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感謝您的反饋:) –

相關問題