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