swift - 在 Swift 结构中比较日/月

标签 swift date struct comparable

我想使用下面的代码对 SpecialDay 实例数组进行排序:[struct1, struct2, struct3, ...]:

struct SpecialDay: Hashable, Comparable {
    var day: Int
    var month: Int

    var hashValue: Int {
        return (31 &* day.hashValue &+ month.hashValue)
    }
}

func ==(lhs: SpecialDay, rhs: SpecialDay) -> Bool {
    return lhs.day == rhs.day && lhs.month == rhs.month
}

func <(lhs: SpecialDay, rhs: SpecialDay) -> Bool {
    return lhs.day < rhs.day && lhs.month <= rhs.month
}

排序会像这样完成:

let newArray = currentArray.sorted({ $0 < $1 })

我想我只需要找到可比方法背后的正确逻辑即可:

func <(lhs: SpecialDay, rhs: SpecialDay) -> Bool

...但是我正在努力解决这个问题。我当前实现的逻辑显然没有正确排序。

如有任何提示,我们将不胜感激。

最佳答案

问题是在这一行中:

return lhs.day < rhs.day && lhs.month <= rhs.month

如果 lhs 月份小于 rhs 它应该总是返回真而不考虑日期。但是,当您与天数进行比较时,您可以得到假的天数不少于月份的真值,从而导致假值。你需要一些更复杂的东西:

func <(lhs: SpecialDay, rhs: SpecialDay) -> Bool {
    if lhs.month < rhs.month { return true }
    else if lhs.month > rhs.month { return false }
    else {
        return lhs.day < rhs.day
    }
}

关于swift - 在 Swift 结构中比较日/月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877618/

相关文章:

objective-c - "Use of unresolved identifier"错误,但我有在框架中声明的标识符

sql - 按日期之间的周数

go - 在 Golang 中将接口(interface){}转换为结构

java - 日期的 json 表示形式无效

c - 返回指针时,什么时候数据需要是静态的?

c - 在 C99 中初始化包含指向另一个结构的指针的结构

swift - 如何运行 swift XCTest tearDown 一次

ios - 首选语言更改后如何恢复应用程序的状态?

ios - 托管对象上下文作为单例?

c++ - 在 C++ 中将字符串转换为日期