自定义运算符是Swift中非常有意思的特性,重载运算符可以使代表变得更加简单,优雅,本文主要介绍我是在工作中如何利用这一特性。

需求:

计算两个日期之间相差几天几小时几分钟

在Objective-c时代,我们实现这个功能需要以下代码:

-(NSDateComponents *)calculateDay:(NSDate *)startDate endDate:(NSDate *)endDate {
NSCalendar *cal = [NSCalendar currentCalendar];
NSUInteger flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents * components = [cal components:flags fromDate:startDate toDate:endDate options:0];
return components;
}
NSDateComponents * components = [self calculateDay:startDate endDate:endDate];
NSLog(@”%d”,components.hour);
NSLog(@”%d”,components.minute);
NSLog(@”%d”,components.second);

在swift中我们可以重载-运算符实现这个功能,结束时间减去开始时间就得到他们之间的差值,这样会更加直观。

func — (lhs: NSDate, rhs: NSDate) -> NSDateComponents {
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Day,.Hour,.Minute,.Second], fromDate: rhs, toDate: lhs, options: NSCalendarOptions.WrapComponents)
return components
}
let components = endDate — startDate
time.text = “\(compents.hour)h \(compents.minute)m \(compents.second)s”

我们可以重载< > == 这样的符号来实现我们特定的需求,大家可以参考 SwiftDate,它已经实现这些操作符。在Swift中实现自定义运算符是非常简单的,可以查看官方文档获取更详细的信息