什么是Swift的“fromAfter”调用数组切片?

时间:2016-10-28 19:46:53

标签: swift3 slice

Swift 3 upTo 通过

分别是非包容性的,包括

  

func前缀(upTo:Int)
  返回从集合开头到指定位置但不包括的子序列。

  

func前缀(通过:Int)
  返回从集合指定位置的开头的子序列。

另一端有来自

  

func suffix(from:Int)
  返回从指定位置到集合末尾的子序列。

似乎是包容性的

远端的非包容性电话是什么?

    // sum the numbers before, and after, an index i...

    let lo = A.prefix(upTo: i).reduce(0,+)    // means noninclusive
    let hi = A.suffix(from: i+1).reduce(0,+)  // 'from' seems to mean inclusive

我不知道的电话是什么?不得不用+1来写。

1 个答案:

答案 0 :(得分:3)

stdlib目前没有针对suffix类型的非包含Collection方法,但对于此用例,您可以通过将suffix(from:)与{{{{}}结合起来轻松实现自己的方法。 1}}(其中,imho,更好地显示意图而不是dropFirst(_:)),例如

from: idx+1

应用于您的示例(在给定分区编号(或索引)之前和之后单独汇总数字,不包括分区编号):

extension Collection where SubSequence == SubSequence.SubSequence {
    public func suffix(after start: Index) -> SubSequence {
        return suffix(from: start).dropFirst(1)
    }
}

离开非包含式/* in this example, invalid indices will yield a full-array sum into lo or hi, depending on high or low index out of bounds, respectively */ func splitSum(of arr: [Int], at: Int) -> (Int, Int) { guard at < arr.count else { return (arr.reduce(0, +), 0) } guard at >= 0 else { return (0, arr.reduce(0, +)) } let lo = arr.prefix(upTo: at).reduce(0, +) let hi = arr.suffix(after: at).reduce(0, +) return (lo, hi) } // example usage let arr = [Int](repeating: 1, count: 10) print(splitSum(of: arr, at: 4)) // (4, 5) 方法的主题,您的拆分和计算的另一种方法是使用the split(...) methods之一suffix类型:

Collection

我认为func splitSum(of arr: [Int], at: Int) -> (Int, Int) { guard at < arr.count else { return (arr.reduce(0, +), 0) } guard at >= 0 else { return (0, arr.reduce(0, +)) } let sums = arr.enumerated() .split (omittingEmptySubsequences: false) { $0.0 == at } .map { $0.reduce(0) { $0 + $1.1 } } guard let lo = sums.first, let hi = sums.last else { fatalError() } return (lo, hi) } // example: same as above 版本有点冗长,而且在显示代码意图方面也在语义上较差。