凡是遵守了Strideable協(xié)議的類型,理論上都是連續(xù)的,在單一維度上的值能夠被抵消和測量,支持整型,浮點型和索引值,Strideable協(xié)議繼承于 Comparable。
假如我們想實現(xiàn)穿越到指定的時間,例如1個小時之后。
//偽代碼
var date = NSDate()
date = date + 3600? ? //3600秒 = 1小時
date += 3600
我們現(xiàn)在給NSDate類擴(kuò)展方法,并遵守Strideable協(xié)議,advancedBy()和distanceTo()這倆個方法是必須實現(xiàn),否則會報錯,告訴你沒按套路來。Strideable協(xié)議的關(guān)聯(lián)對象是Stride,遵守SignedNumberType協(xié)議。
extension? NSDate: Strideable{
? ? ? public func advancedBy(n: NSTimeInterval) ->Self {
? ? ? ? ? ? ?return dateByAddingTimeInterval(n)
? ? ? }
? ? ? publicfunc distanceTo(other:NSDate) ->NSTimeInterval {
? ? ? ? ? ? ?return other.timeIntervalSinceDate(self)
? ? ? }
}
var time =NSDate()
time = time + 60.00
time += 60
這樣我們就可實現(xiàn)通過加法(+)運算符任意地增加時間了,或減法(-)運算符減去時間。
我們也可以調(diào)用advancedBy()函數(shù)實現(xiàn)增減效果。
time.advancedBy(3600)? //增加1小時
time.advancedBy(-3600)? //減少1小時
我們還可以用distanceTo()測量距離或是間隔,比如說:求
var anHourLaterTime =time +3600
var distance = time.distanceTo(anHourLaterTime)? ? //anHourLaterTime - time
print(distance)? ? ? ? ? //距離為3600
遵守了Strideable協(xié)議的類型,默認(rèn)會實現(xiàn)func stride(through:by:)和func stride(to:by:)倆個函數(shù)
func stride(through end:NSDate, by stride:NSTimeInterval) ->NSDate {
? ? ? returndateByAddingTimeInterval(stride)
}
func stride(to end:NSDate, by stride:NSTimeInterval) ->NSDate {
? ? ? returndateByAddingTimeInterval(stride)
}
也可以調(diào)用這倆個方法實現(xiàn)增減時間效果
time.stride(through:NSDate(), by: 3600)
time.stride(to:NSDate(), by: 3600)