作者:Erica Sadun,原文鏈接吱涉,原文日期:2016-05-11
譯者:pucca刹泄;校對(duì):wiilen;定稿:CMB
昨天在 Swift-Users 有人提問(wèn)如何防止序列(sequence)為空怎爵。這個(gè)問(wèn)題來(lái)源于如何在斷言(predicate)中測(cè)試一個(gè)序列特石,由此引發(fā)的問(wèn)題是如果序列為空,會(huì)返回 true 來(lái)滿(mǎn)足斷言鳖链。
我們先不考慮這種處理是否有問(wèn)題(我認(rèn)為這種處理是正確的姆蘸,因?yàn)橐粋€(gè)空序列里沒(méi)有元素,對(duì)元素的斷言也就不會(huì)失斳轿)逞敷,Jeremy Pereira 提出了一個(gè)相當(dāng)巧妙的解決方案:
func all(@noescape where predicate: Generator.Element throws -> Bool) rethrows -> Bool {
var count = 0
for element in self {
guard try predicate(element) else { return false }
count += 1
}
return count > 0
}
但從此討論中延伸出的另一個(gè)大問(wèn)題是“如何優(yōu)雅地判斷一個(gè)序列是否為空?”灌侣。我的方法是用緩沖區(qū)(buffer)并進(jìn)行預(yù)處理推捐。以下是我的第一次嘗試,粗糙不堪侧啼,請(qǐng)不吝指教牛柒。
public struct BufferedSequence<Base : SequenceType>:GeneratorType, SequenceType {
internal var _base: Base
internal var _generator: Base.Generator
public var bufferedElement: Base.Generator.Element?
public init(_ base: Base) {
_base = base
_generator = base.generate()
bufferedElement = _generator.next()
}
public mutating func next() -> Base.Generator.Element? {
defer {
if bufferedElement != nil {
bufferedElement = _generator.next()
}
}
return bufferedElement
}
public func isEmpty() -> Bool {
return bufferedElement == nil
}
}
有趣的是,寫(xiě)這個(gè)小東西最難的不是如何進(jìn)行預(yù)處理痊乾,而是將 Swift 3 的語(yǔ)法轉(zhuǎn)換回 Swift 2.2皮壁,這樣我就能在 playground 中進(jìn)行混編了。
你的語(yǔ)法轉(zhuǎn)換進(jìn)行的怎樣了符喝?已經(jīng)全部轉(zhuǎn)換成 3 的語(yǔ)法了?還是堅(jiān)守 2.2 寫(xiě)生產(chǎn)代碼甜孤?
本文由 SwiftGG 翻譯組翻譯协饲,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg缴川。