推进Swift中Range的所有元素?

时间:2016-01-21 22:45:16

标签: swift range

如果我有一个范围,请说

let bilbo = ( 1 ... 5 )

我想用一个数字来推进它的所有元素,比方说3,除了

之外还有其他方法
let offset = 3
let baggins = ( bilbo.first! + offset ... bilbo.last! + offset )

这样的东西
bilbo.advance_by( 3 )

我发现只适用于Range中的一个元素?

我搜索了网络,并且无法找到答案。我猜测有一种Swift-ish的方法可能会出现在某个地方的另一个SO帖子中,我只是不理解它是如何连接的。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

let advanceRangeBy : (Range<Int>, Int) -> Range<Int> = { $0.0.first!.advancedBy($0.1) ... $0.0.last!.advancedBy($0.1) }

let bilbo = 1...5
let bagger = advanceRangeBy(bilbo, 3) // 4..<9

你也可以把它作为Range的通用扩展,它适用于许多(尽管不是全部)类型的Range:

let bilbo = 1...5

extension Range where Element : BidirectionalIndexType {
    func advanceRangeBy(advance: Element.Distance) -> Range<Element> {
        return first!.advancedBy(advance) ... last!.advancedBy(advance)
    }
}

let baggins = bilbo.advanceRangeBy(3)

为了完整起见,我想我还要补充一点,您还可以使用自定义二进制中缀运算符执行此范围提升/去推进操作

infix operator <> {
    associativity left
    precedence 140     /* use same precedence as '+', '-' arithmetic */
}
func <> (lhs: Range<Int>, rhs: Int) -> Range<Int>{
    var out : Range<Int> = lhs
    out.endIndex = lhs.endIndex + rhs
    out.startIndex = lhs.startIndex + rhs
    return out
}

let bilbo = 1...5
let bagger = bilbo <> 3    // 4..<9
let frodo = bagger <> (-2) // 2..<7

答案 1 :(得分:2)

简单的扩展如何:

extension Range {

       public func advancedBy(n: Element.Distance) -> Range<Element> {

       let startIndex = self.startIndex.advancedBy(n)
       let endIndex = self.endIndex.advancedBy(n)

       return Range(start: startIndex, end: endIndex)
    }
}

答案 2 :(得分:1)

使用地图:

let bagger = bilbo.map { $0.advancedBy(3) }