在Swift中推进范围内的所有元素?

在Swift中推进范围内的所有元素?,swift,range,Swift,Range,如果我有一个范围,就说 let bilbo = ( 1 ... 5 ) 我想用一个数字来推进它的所有元素,比如说3,还有别的方法吗 let offset = 3 let baggins = ( bilbo.first! + offset ... bilbo.last! + offset ) 差不多 bilbo.advance_by( 3 ) 我发现它只对范围内的一个元素有效 我在网上搜索过,找不到答案。我猜有一种快速的方法可以做到这一点,它可能出现在另一篇SO帖子中,我只是不理解它是如何连

如果我有一个范围,就说

let bilbo = ( 1 ... 5 )
我想用一个数字来推进它的所有元素,比如说3,还有别的方法吗

let offset = 3
let baggins = ( bilbo.first! + offset ... bilbo.last! + offset )
差不多

bilbo.advance_by( 3 )
我发现它只对范围内的一个元素有效

我在网上搜索过,找不到答案。我猜有一种快速的方法可以做到这一点,它可能出现在另一篇SO帖子中,我只是不理解它是如何连接的。任何帮助都将不胜感激。

让advanceRangeBy:(Range,Int)->Range={0.0.first!。advancedBy($0.1)..0.0.last!。advancedBy($0.1)}
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
设bilbo=1…5 设bagger=advanceRangeBy(bilbo,3)//4。。射程{ 返回第一个!.advancedBy(高级)…最后一个!.advancedBy(高级) } } 设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
中缀运算符{
左结合性
优先级140/*使用与“+”、“-”算术相同的优先级*/
}
func(左:范围,右:整数)->范围{
var out:范围=lhs
out.endIndex=lhs.endIndex+rhs
out.startIndex=lhs.startIndex+rhs
返回
}
设bilbo=1…5
让bagger=bilbo 3//4..使用地图:

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

一个简单的扩展怎么样:

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)
    }
}
请注意,CountableRange只是以下各项的类型别名:

typealias CountableRange=绑定的范围:可移动,绑定。跨步:签名整数

任何以“如何通过迭代X的每个元素将X转换为Y”开头的问题的底线答案都是“使用映射”完美,@DavidBerry。我有一种感觉就是这样。知道为什么有人否决了这个吗?我问了一个合理的问题,并做了一些努力使之尽可能清晰。我不确定,这个结束表示有人觉得这个问题没有足够的信息。并不是说,
bagger
现在是一个整数数组,不再是一个
范围。
。正如@dfri指出的,我并没有真正回答这个问题,取决于你真正想要什么。我已将结果从
范围更改为
[Int]
,我可能会将其作为Range@dfri.Edited上的扩展,以添加扩展选项,以便保留我先前的(稍有不正确的)答案。@DavidBerry你说得对,你比我早了一步。谢谢你!(为了两个代码块之间的一致性,重新编辑了一些空格)和@KoCMoHaBTa的答案甚至允许扩展在所有范围内工作,我可能只对操作符使用“+”,但这是一个非常优雅的解决方案,@KoCMoHaBTa说。测试和工作。
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)
    }
}
public extension CountableRange {
    func advanced(by n: Bound.Stride) -> Self {
        
        let lowerBound = self.lowerBound.advanced(by: n)
        let upperBound = self.upperBound.advanced(by: n)
        
        return .init(uncheckedBounds: (lowerBound, upperBound))
    }

    static func + (lhs: Self, rhs: Bound.Stride) -> Self {
        lhs.advanced(by: rhs)
    }
}
typealias CountableRange<Bound> = Range<Bound> where Bound : Strideable, Bound.Stride : SignedInteger