通过 NSDate 对象属性进行 Swift 过滤

Posted

技术标签:

【中文标题】通过 NSDate 对象属性进行 Swift 过滤【英文标题】:Swift filter by NSDate object property 【发布时间】:2015-03-17 09:51:49 【问题描述】:

我想用日期属性过滤我的自定义对象。

例如:

class Event

    let dateFrom: NSDate!
    let dateTo: NSDate!

    init(dateFrom: NSDate, dateTo: NSDate) 
        self.dateFrom = dateFrom
        self.dateTo = dateTo
    

现在我有一个可能包含 500 个事件的列表,我只想显示特定日期的事件。我可以遍历所有对象,并创建一个新的对象数组,但我也可以使用过滤器吗?

我尝试过这样的事情:

let specificEvents = eventList.filter(  return $0.dateFrom > date  )

其中 date 是特定日期的 NSDate 对象,但我无法使用 > 运算符。

是否有一种简单的方法可以获取特定日期的所有事件,其中日期介于 dateFrom 和 dateTo 期间?

【问题讨论】:

比较***.com/a/26577608/1187415. 谢谢 - 看起来很棒! 【参考方案1】:

感谢 Martin 为我指明了正确的方向。

如果其他人正在寻找如何在 Swift 中解决这个问题,这里是一个答案:

向 NSDate 添加扩展:

public func <(a: NSDate, b: NSDate) -> Bool 
    return a.compare(b) == NSComparisonResult.OrderedAscending


public func ==(a: NSDate, b: NSDate) -> Bool 
    return a.compare(b) == NSComparisonResult.OrderedSame


extension NSDate: Comparable  

因此您可以使用 运算符进行 NSDate 比较。

    var date = dateFormatter.dateFromString(dateString)
    var dateTomorrow = date?.dateByAddingTimeInterval(NSTimeInterval(60*60*24)) // add one Day

    eventsToday = allEvents.filter(  return $0.dateFrom >= date && $0.dateTo < dateTomorrow )

【讨论】:

【参考方案2】:

对于 Swift 3.x 更新:-

extension Date: Comparable
   public static func <(a: Date, b: Date) -> Bool
        return a.compare(b) == ComparisonResult.orderedAscending
    
    static public func ==(a: Date, b: Date) -> Bool 
        return a.compare(b) == ComparisonResult.orderedSame
    

【讨论】:

以上是关于通过 NSDate 对象属性进行 Swift 过滤的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSDate 的核心数据排序描述符,使用 Swift 的 iOS

搜索 CoreData 以匹配 NSDate - Swift

Swift 2.0 按属性对对象数组进行排序

Swift 和 ObjectMapper:具有最小值的 NSDate

Swift:获取由某个属性过滤的对象数组的索引

NSSortDescriptor 使用实体的 NSDate 属性(Swift)