Функциональные операции с массивами Swift

Функциональные операции с массивами позволяют работать с данными более гибко и удобно, используя принципы функционального программирования. Такие методы, как map, filter, reduce и forEach, помогают преобразовывать массивы, отфильтровывать элементы и выполнять вычисления в несколько строк кода. В этой статье мы подробно рассмотрим основные функциональные операции с массивами и покажем, как эффективно применять их на практике.


Трансформация массивов

Метод map

Метод map позволяет преобразовывать каждый элемент массива и создавать новый массив на основе результатов.

let numbers = [1, 2, 3, 4, 5]

// Умножение каждого числа на 2
let doubled = numbers.map { $0 * 2 }
// [2, 4, 6, 8, 10]

// Преобразование чисел в строки
let strings = numbers.map { String($0) }
// ["1", "2", "3", "4", "5"]

// Более сложное преобразование
let formatted = numbers.map { "Число: \($0)" }
// ["Число: 1", "Число: 2", "Число: 3", "Число: 4", "Число: 5"]

Методы flatMap и compactMap

Методы flatMap и compactMap полезны при работе с вложенными массивами или опциональными значениями.

// flatMap для объединения вложенных массивов
let nestedArrays = [[1, 2], [3, 4], [5, 6]]
let flattened = nestedArrays.flatMap { $0 }
// [1, 2, 3, 4, 5, 6]

// compactMap для фильтрации nil и извлечения значений из опционалов
let optionalNumbers: [Int?] = [1, nil, 3, nil, 5]
let nonNilNumbers = optionalNumbers.compactMap { $0 }
// [1, 3, 5]

// Использование compactMap для преобразования и фильтрации
let strings = ["1", "два", "3", "четыре", "5"]
let parsedNumbers = strings.compactMap { Int($0) }
// [1, 3, 5]

Фильтрация массивов

Метод filter

Метод filter позволяет отбирать элементы массива, которые соответствуют определенному условию.

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// Фильтрация четных чисел
let evenNumbers = numbers.filter { $0 % 2 == 0 }
// [2, 4, 6, 8, 10]

// Фильтрация чисел больше 5
let largeNumbers = numbers.filter { $0 > 5 }
// [6, 7, 8, 9, 10]

// Комбинирование условий
let evenLargeNumbers = numbers.filter { $0 % 2 == 0 && $0 > 5 }
// [6, 8, 10]

Методы first, last и contains

Swift предоставляет методы для поиска элементов, удовлетворяющих условию.

let numbers = [3, 7, 1, 9, 2, 6, 4, 8, 5]

// Поиск первого четного числа
if let firstEven = numbers.first(where: { $0 % 2 == 0 }) {
    print("Первое четное число: \(firstEven)") // 2
}

// Поиск последнего числа больше 5
if let lastLarge = numbers.last(where: { $0 > 5 }) {
    print("Последнее число больше 5: \(lastLarge)") // 8
}

// Проверка наличия элемента в массиве
let hasEight = numbers.contains(8) // true

// Проверка наличия элемента, удовлетворяющего условию
let hasLargeOdd = numbers.contains(where: { $0 > 5 && $0 % 2 != 0 }) // true (7 и 9)

Агрегация массивов

Метод reduce

Метод reduce позволяет комбинировать все элементы массива в одно значение.

let numbers = [1, 2, 3, 4, 5]

// Суммирование всех элементов
let sum = numbers.reduce(0, +)
// 15

// Перемножение всех элементов
let product = numbers.reduce(1, *)
// 120

// Использование замыкания для более сложной логики
let description = numbers.reduce("Числа:") { result, number in
    return "\(result) \(number)"
}
// "Числа: 1 2 3 4 5"

Методы min, max и sorted

Swift предоставляет методы для нахождения минимального и максимального элементов, а также для сортировки массива.

let numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]

// Нахождение минимального элемента
if let minimum = numbers.min() {
    print("Минимальный элемент: \(minimum)") // 1
}

// Нахождение максимального элемента
if let maximum = numbers.max() {
    print("Максимальный элемент: \(maximum)") // 9
}

// Сортировка массива по возрастанию
let ascending = numbers.sorted()
// [1, 1, 2, 3, 4, 5, 5, 6, 9]

// Сортировка массива по убыванию
let descending = numbers.sorted(by: >)
// [9, 6, 5, 5, 4, 3, 2, 1, 1]

// Сортировка с использованием пользовательской логики
let strings = ["яблоко", "груша", "банан", "апельсин"]
let byLength = strings.sorted { $0.count < $1.count }
// ["груша", "яблоко", "банан", "апельсин"]

Дополнительные материалы

Также читайте:  В чем коренные отличия UIKit и SwfitUI?