Пишу простым языком об iOS разработке на Swift и мобильной разработке в целом.
Обо мне: https://t.me/hardworkerIT/3
Чат: @hardworkerChatIT
Канал про разработку и жизнь в ИТ: @itDenisov
Вакансии по мобильной разработке: @mobileDevJobs
Post #215
1.25K
🔢 Циклы for против функций высшего порядка в Swift: что выбрать.
В Swift у разработчиков есть выбор: использовать традиционные циклы for или функции высшего порядка. Давайте разберемся, где каждый подход раскрывается лучше всего.
Сильные стороны функций высшего порядка.
Для простых преобразований данных map выглядит чище:
filter идеален для отбора элементов:
reduce отлично подходит для агрегации:
Когда циклы for предпочтительнее.
Логика с условиями:
Ранний выход из цикла:
Изменение внешних переменных:
Производительность.
Для массивов до 1000 элементов разница в производительности между функциями высшего порядка и циклом for практически незаметна. Современные оптимизации компилятора Swift отлично справляются с функциональными методами. Однако при обработке десятков тысяч элементов циклы for могут быть на 10-30% быстрее.
Функции высшего порядка часто создают промежуточные массивы. Цепочка map, filter, map может создать 3 временных массива, тогда как цикл for работает с одним. Для больших данных это влияет на память.
🔗 Ссылка на подробную статью
💡 Вывод:
Swift предлагает нам два мощных подхода к обработке данных, и мудрый разработчик знает, когда применять каждый из них. Функции высшего порядка прекрасно справляются с простыми и средними по сложности преобразованиями данных. Они делают код более декларативным, читаемым и безопасным за счет неизменяемости.
Однако традиционные циклы for остаются незаменимыми, когда речь идет о сложной бизнес логике с множеством условий внутри цикла, необходимости раннего выхода из цикла или изменении внешних переменных.
➡️ Подписаться на канал
Мобильный трудоголик
В Swift у разработчиков есть выбор: использовать традиционные циклы for или функции высшего порядка. Давайте разберемся, где каждый подход раскрывается лучше всего.
Сильные стороны функций высшего порядка.
Для простых преобразований данных map выглядит чище:
// Более читаемо
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = numbers.map { $0 * $0 }
// squaredNumbers = [1, 4, 9, 16, 25]
// Чем
let numbers = [1, 2, 3, 4, 5]
let squaredNumbers = [Int]()
for number in numbers {
squaredNumbers.append(number * number)
}
// squaredNumbers = [1, 4, 9, 16, 25]
filter идеален для отбора элементов:
let users = [
User(name: "Анна", isActive: true, age: 25),
User(name: "Петр", isActive: false, age: 30),
User(name: "Мария", isActive: true, age: 22)
]
let activeUsers = users.filter { $0.isActive }
// activeUsers = [User(name: "Анна", isActive: true, age: 25), User(name: "Мария", isActive: true, age: 22)]
reduce отлично подходит для агрегации:
let prices = [100, 200, 300]
let totalPrice = prices.reduce(0) { currentSum, price in
return currentSum + price
}
// totalPrice = 600
Когда циклы for предпочтительнее.
Логика с условиями:
var passedStudents: [String] = []
let studentGrades = [45, 82, 91, 33, 67, 74, 58, 29, 95]
for grade in studentGrades {
guard grade >= 60 else { continue } // Исключаем оценки ниже 60
guard grade <= 90 else { continue } // Исключаем оценки выше 90
passedStudents.append("Студент с оценкой \(grade)")
}
/*
passedStudents = [
"Студент с оценкой 82",
"Студент с оценкой 67",
"Студент с оценкой 74"
]
*/
Ранний выход из цикла:
// Поиск первого отрицательного числа
let dailyTemperatures = [15, 18, -2, 20, 25, -5]
var firstNegative: Int?
for temperature in dailyTemperatures {
if temperature < 0 {
firstNegative = temperature
break // Выходим при первом найденном
}
}
// firstNegative = -2
Изменение внешних переменных:
let itemsToProcess = [1, 15, 41, 3, 22, 61]
var processedItems = 0
var failedItems = 0
for item in itemsToProcess {
if processItem(item) {
processedItems += 1
} else {
failedItems += 1
}
}
Производительность.
Для массивов до 1000 элементов разница в производительности между функциями высшего порядка и циклом for практически незаметна. Современные оптимизации компилятора Swift отлично справляются с функциональными методами. Однако при обработке десятков тысяч элементов циклы for могут быть на 10-30% быстрее.
Функции высшего порядка часто создают промежуточные массивы. Цепочка map, filter, map может создать 3 временных массива, тогда как цикл for работает с одним. Для больших данных это влияет на память.
🔗 Ссылка на подробную статью
💡 Вывод:
Swift предлагает нам два мощных подхода к обработке данных, и мудрый разработчик знает, когда применять каждый из них. Функции высшего порядка прекрасно справляются с простыми и средними по сложности преобразованиями данных. Они делают код более декларативным, читаемым и безопасным за счет неизменяемости.
Однако традиционные циклы for остаются незаменимыми, когда речь идет о сложной бизнес логике с множеством условий внутри цикла, необходимости раннего выхода из цикла или изменении внешних переменных.
➡️ Подписаться на канал
Мобильный трудоголик
- ❤ 15
- 👍 11
- 🔥 2
- 🙏 1

