Удаление метода экземпляра Swift Array (at: Int) - PullRequest
0 голосов
/ 16 сентября 2018

Array в Swift имеет несколько экземпляров методов для исключения элементов, таких как dropFirst(), dropLast(), drop(while:) и т. Д. А как же drop(at:)?

Примечание: я бы использовал remove(at:), но массив, с которым я работаю, это let константа.

Ответы [ 5 ]

0 голосов
/ 17 сентября 2018

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]

РЕДАКТИРОВАТЬ Кажется, Apple предпочла бы, чтобы вы сказали (используя частичные диапазоны)

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

но лично я думаю, что это уродливее, и после всех предложенных мною методов не считается устаревшим или что-то в этом роде.

0 голосов
/ 17 сентября 2018

Примечание: я бы использовал 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]
0 голосов
/ 16 сентября 2018

Единственное, что я хотел бы добавить к вашей реализации - это защитное заявление с полезным сообщением об ошибке:

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]
0 голосов
/ 16 сентября 2018

Вы можете расширить протокол 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"

Если вы хотите также принять String.Index в вашем методе:

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"
0 голосов
/ 16 сентября 2018

Как насчет использования расширения Swift для добавления 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]"

Примечание: Вы также можете добавить drop(at:) к ArraySlice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...