如果我有一个范围,请说
let bilbo = ( 1 ... 5 )
我想用一个数字来推进它的所有元素,比方说3,除了
之外还有其他方法let offset = 3
let baggins = ( bilbo.first! + offset ... bilbo.last! + offset )
像
这样的东西bilbo.advance_by( 3 )
我发现只适用于Range中的一个元素?
我搜索了网络,并且无法找到答案。我猜测有一种Swift-ish的方法可能会出现在某个地方的另一个SO帖子中,我只是不理解它是如何连接的。任何帮助将不胜感激。
答案 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) }