代码之家  ›  专栏  ›  技术社区  ›  ma11hew28

Swift数组实例方法drop(at:Int)

  •  0
  • ma11hew28  · 技术社区  · 6 年前

    Array in Swift dropFirst() , dropLast() , drop(while:) 等等。那怎么办 drop(at:) ?

    注意:我会使用 remove(at:) ,但我使用的数组是 let 不变的。

    5 回复  |  直到 6 年前
        1
  •  2
  •   matt    6 年前

    注意:我会使用 remove(at:) ,但我使用的数组是一个常量。

    extension Array {
        func drop(at:Int) -> [Element] {
            var temp = self
            temp.remove(at: at)
            return temp
        }
    }
    let numbers = [1, 2, 3, 4, 5]
    print(numbers.drop(at: 2)) // [1, 2, 4, 5]
    
        2
  •  2
  •   Leo Dabus    6 年前

    你可以扩展 RangeReplaceableCollection Array

    extension RangeReplaceableCollection {
        func drop(at offset: Int) -> SubSequence {
            let index = self.index(startIndex, offsetBy: offset, limitedBy: endIndex) ?? endIndex
            let next = self.index(index, offsetBy: 1, limitedBy: endIndex) ?? endIndex
            return self[..<index] + self[next...]
        }
    }
    

    var str = "Hello, playground"
    str.drop(at: 5)  // "Hello playground"
    

    let numbers = [1, 2, 3, 4, 5]
    print(numbers.drop(at: 2))  // "[1, 2, 4, 5]\n"
    

    如果你也愿意接受字符串.索引在你的方法中:

    extension RangeReplaceableCollection {
        func drop(at index: Index) -> SubSequence {
            let index = self.index(startIndex, offsetBy: distance(from: startIndex, to: index), limitedBy: endIndex) ?? endIndex
            let next = self.index(index, offsetBy: 1, limitedBy: endIndex) ?? endIndex
            return self[..<index] + self[next...]
        }
    }
    

    var str = "Hello, playground"
    str.drop(at: 0)               // "ello, playground"
    str.drop(at: str.startIndex)  // "ello, playground"
    
        3
  •  1
  •   ielyamani    6 年前

    我唯一要添加到您的实现中的是一个带有有用错误消息的guard语句:

    extension Array {
        func drop(at index: Int) -> ArraySlice<Element> {
            guard indices.contains(index) else {
                fatalError("Index out of range")
            }
            return self[0..<index] + self[(index+1)..<endIndex]
        }
    
        func drop(range: CountableRange<Int>) -> ArraySlice<Element> {
            guard (indices.lowerBound, range.upperBound) <= (range.lowerBound, indices.upperBound) else {
                fatalError("Range is out of the indices bounds")
            }
            return self[0..<range.lowerBound] + self[range.upperBound..<endIndex]
        }
    }
    
    let a = [1,2,3]
    a.drop(at: 3)          //Fatal error: Index out of range
    let b = [0,1,2,3,4,5]
    b.drop(range: 1..<5)   //[0, 5]
    
        4
  •  1
  •   matt    6 年前

    return self[0..<index] + self[index+1..<endIndex]

    丑陋。为什么不使用你得到的工具?

    extension Array {
        func drop(at:Int) -> ArraySlice<Element> {
            return prefix(upTo: at) + suffix(from: at+1)
        }
    }
    let arr = [1,2,3,4,5]
    let slice = arr.drop(at:2) // [1,2,4,5]
    

    编辑

    return self[..<at] + self[(at+1)...]
    

    但就我个人而言,我觉得这更难看,毕竟我建议的方法并没有遭到反对。

        5
  •  1
  •   ma11hew28    6 年前

    Swift extension drop(at:) Array

    extension Array {
      func drop(at index: Int) -> ArraySlice<Element> {
        precondition(indices.contains(index), "Index out of range")
        return self[..<index] + self[(index+1)...]
      }
    }
    

    它返回原始数组的一个片段,该片段不包含指定索引处的元素。

    let numbers = [1, 2, 3, 4, 5]
    print(numbers.drop(at: 2))
    // Prints "[1, 2, 4, 5]"
    

    注意:您可能还需要添加 下降(在:) ArraySlice