数组 – 如何通过属性值(日期)对包含NSManagedObject子类的实例的swift数组进行排序

我试图排序一个数组的布局在 the accepted answer to this question,但我遇到的问题,Isuru提到的答案的评论。也就是说,应该通过实体的“date”属性对数组排序的代码使编译器投诉“无法找到成员”日期“

这里是描述实体的NSManagedObject子类:

import Foundation
import CoreData

@objc(Entry)
class Entry: NSManagedObject {

    @NSManaged var date: NSDate
    @NSManaged var reflections: AnyObject
    @NSManaged var contactComment: NSSet
    @NSManaged var person: NSSet

    override func awakeFromInsert() {
        let now:NSDate = NSDate()
        self.date = now;
    }
}

这里是试图排序数组的代码:

lazy var entries:[Entry] = {
    var days:[Entry] = self.managedObjectContext!.requestEntity("Entry")as [Entry]
    days.sort({$0.date < $1.date})

    var today:Entry = days.last!
    println(today.date)
    return days
}()

注意,在代码的后半部分,我可以访问并记录其中一个条目的“date”属性,并且编译器没有问题。

我的排序的语法是否正确?这个代码有没有另一个问题,我没有看到?

这是一个问题,Swift编译器没有给你一个有用的错误。真正的问题是NSDate不能与<直。相反,你可以使用NSDate的比较方法,像这样:
days.sort({ $0.date.compare($1.date) == NSComparisonResult.OrderedAscending })

或者,您可以扩展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 { }

注意:您只需要实现<和==并且如上所示,则标准库将提供其余的运算符< =,>等。

有了这个,原来的排序功能应该工作很好:

days.sort({ $0.date < $1.date })

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...