Swift 3 为啥不能将二元运算符“===”应用于两个“日期”操作数?

Posted

技术标签:

【中文标题】Swift 3 为啥不能将二元运算符“===”应用于两个“日期”操作数?【英文标题】:Swift 3 Why can't Binary operator '===' be applied to two 'Date' operands?Swift 3 为什么不能将二元运算符“===”应用于两个“日期”操作数? 【发布时间】:2016-12-01 16:41:51 【问题描述】:
public func ==(lhs: Date, rhs: Date) -> Bool 
  return lhs === rhs || lhs.compare(rhs) == .orderedSame

升级到 Swift 3 后,我现在收到此错误...“二进制运算符 ===不能应用于两个 Date 操作数”

关于如何纠正此问题的任何建议?

【问题讨论】:

Swift 3 Date 是一个已经符合 Comparable 协议的结构。 ***.com/questions/39541879/… 【参考方案1】:

在 Swift 3 中,Date 是一个结构(值类型),没有身份,因此不能被 ==='ed。

其实Date类型已经提供了a built-in ==所以你不需要自己实现。

【讨论】:

没有身份是什么意思? @Honey Identity = 参考 = 指针值。具有相同值的结构彼此无法区分,即您不能为每个结构值分配标识。见***.com/a/25334176/224671。【参考方案2】:

虚拟代码 sn-p 以供将来参考。主要部分是使用timeIntervalSinceNow,它将转换为Double,然后进行比较

let inputFormatter = DateFormatter()
        inputFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")
        inputFormatter.dateFormat = "MMM dd, yyyy hh:mm:ss a"

        dataArray = dataArray.sorted(by:  (crm1 : CRM, crm2 : CRM) -> Bool in
             inputFormatter.date(from: crm1.date1!)!.timeIntervalSinceNow <= inputFormatter.date(from: crm2.date1!)!.timeIntervalSinceNow
        )

【讨论】:

【参考方案3】:

Leo Dabus 指出了一篇文章SOLUTION POST

我使用 >= 来纠正问题。

【讨论】:

您可以使用任何比较运算符。只需删除您之前为 NSDate 定义的所有自定义运算符【参考方案4】:

我已经通过强制解开日期对象来解决它

let secondF = DateFormatter()
secondF.dateFormat = "yyyy-MM-dd"

let startdate = secondF.date(from: "2020-03-01")
let endDate = secondF.date(from: "2020-02-01")

if startdate! == endDate!
   print("succedded")

【讨论】:

以上是关于Swift 3 为啥不能将二元运算符“===”应用于两个“日期”操作数?的主要内容,如果未能解决你的问题,请参考以下文章

二元运算符“==”不能应用于“字符串?”类型的操作数和 Swift 3 中的“布尔”

Swift 二元运算符“+”不能应用于两个 CGFloat 操作数

解析 / Swift 问题与 tableviewcell“二元运算符'=='不能应用于单元格和 nil 类型的操作数”

二元运算符“==”不能应用于“布尔”和“字符串?”类型的操作数对于 2020 年的 Swift [重复]

二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”

二元运算符“+”不能应用于“_”和“字符串”类型的操作数