Расширения Swift Array: полезные методы улучшения функциональности массивов

В Swift вы можете использовать расширения для добавления новых функций к существующим типам, включая массивы. Вот несколько методов, которые вы можете добавить, чтобы расширить функциональность массивов в Swift:

  1. среднее: вычисляет среднее значение всех элементов массива.

    extension Array where Element: Numeric {
    func average() -> Element? {
        guard !isEmpty else { return nil }
        let sum = reduce(0, +)
        return sum / Element(count)
    }
    }
    let numbers = [1, 2, 3, 4, 5]
    let avg = numbers.average() // 3
  2. startsWith: проверяет, начинается ли массив с заданного префикса.

    extension Array where Element: Equatable {
    func startsWith(_ prefix: [Element]) -> Bool {
        prefix.count <= count && prefix.elementsEqual(self[..<prefix.endIndex])
    }
    }
    let array = [1, 2, 3, 4, 5]
    let startsWithPrefix = array.startsWith([1, 2]) // true
  3. дубликаты: находит все элементы, которые встречаются в массиве более одного раза.

    extension Array where Element: Hashable {
    func duplicates() -> [Element] {
        let counts = reduce(into: [:]) { counts, element in
            counts[element, default: 0] += 1
        }
        return Array(counts.filter { $0.value > 1 }.keys)
    }
    }
    let numbers = [1, 2, 2, 3, 4, 4, 5]
    let duplicates = numbers.duplicates() // [2, 4]
  4. shuffle: возвращает новый массив с элементами, перемешанными случайным образом.

    extension Array {
    func shuffled() -> [Element] {
        var array = self
        for i in array.indices.dropLast() {
            let j = Int.random(in: i..<array.count)
            if i != j {
                array.swapAt(i, j)
            }
        }
        return array
    }
    }
    let numbers = [1, 2, 3, 4, 5]
    let shuffledNumbers = numbers.shuffled() // [4, 2, 1, 5, 3]
  5. removeAll: удаляет все вхождения данного элемента из массива.

    extension Array where Element: Equatable {
    mutating func removeAll(_ element: Element) {
        removeAll { $0 == element }
    }
    }
    var numbers = [1, 2, 2, 3, 4, 4, 5]
    numbers.removeAll(2)
    print(numbers) // [1, 3, 4, 4, 5]