Разбираем параметры по умолчанию в Swift: зачем они нужны, как их правильно применять и где они встречаются в стандартной библиотеке. Научись писать чистый код уже сегодня!
Представь, что ты пишешь функцию для генератора тренировочных монтажей в стиле аниме 🥋:
func startTraining(student: String, intensity: String, withMusic: Bool) {
print("\(student) начинает тренировку с интенсивностью \(intensity)!")
if withMusic {
print("🎵 Играет драматическая музыка 🎵")
}
}
startTraining(student: "Naruto", intensity: "extreme", withMusic: true)Теперь представь, что 90% твоих монтажей — с интенсивностью "extreme" и музыкой. Вызывать функцию с тремя параметрами каждый раз утомительно. Именно эту проблему решают параметры по умолчанию: пусть частый случай будет коротким, а редкий — всё ещё возможным.
func startTraining(student: String, intensity: String = "extreme", withMusic: Bool = true) {
print("\(student) начинает тренировку с интенсивностью \(intensity)!")
if withMusic {
print("🎵 Играет драматическая музыка 🎵")
}
}
startTraining(student: "Naruto")
startTraining(student: "Sakura", intensity: "moderate")
startTraining(student: "Rock Lee", intensity: "extreme", withMusic: false)Все три вызова корректны. Первый использует оба значения по умолчанию, второй переопределяет только intensity, третий — оба дополнительных параметра. 🎉
Swift не требует строго располагать параметры по умолчанию в конце, но это настоятельно рекомендуется. Вот почему:
func describeCharacter(name: String, power: String = "unknown", age: Int) {
print("\(name) \(age) лет с силой \(power).")
}
describeCharacter(name: "Goku", age: 30)Это компилируется, но вызов выглядит неловко. Когда смешиваются именованные и неименованные параметры, размещение значения по умолчанию в середине может привести к путанице. Принято ставить часто изменяемые параметры первыми, а редко изменяемые с умолчаниями — в конец.
func describeCharacter(name: String, age: Int, power: String = "unknown") {
print("\(name) \(age) лет с силой \(power).")
}
describeCharacter(name: "Goku", age: 30)
describeCharacter(name: "Goku", age: 30, power: "Kamehameha")Гораздо чище. ✨
Swift сам активно использует параметры по умолчанию. Как только начинаешь их замечать, многое «магическое» поведение становится понятным.
removeAll(keepingCapacity:)var characters = ["Lana", "Pam", "Ray", "Sterling"]
characters.removeAll() // то же самое:
characters.removeAll(keepingCapacity: false)keepingCapacity по умолчанию false, потому что чаще всего после очистки массива память больше не нужна. Но если ты собираешься заполнить его заново, removeAll(keepingCapacity: true) избегает лишнего перераспределения памяти.
let name = "naruto"
name.compare("Naruto") // опции по умолчанию
name.compare("Naruto", options: .caseInsensitive)compare(_:options:) имеет пустой набор опций по умолчанию, поэтому простой случай (регистрозависимое сравнение) не требует дополнительных аргументов, а регистронезависимое — всего один параметр.
print()!Ты всё это время пользовался параметрами по умолчанию, не осознавая этого:
print("Hello")
print("Hello", separator: " ", terminator: "\n")print имеет значения по умолчанию для separator (пробел) и terminator (перевод строки). Вот почему print("a", "b", "c") выводит a b c с переносом строки в конце. А если переопределить terminator: "", можно выводить несколько сообщений на одной строке:
print("Loading", terminator: "")
print("...", terminator: "")
print("done!")
// Вывод: Loading...done!Легко спутать параметры по умолчанию с опционалами (Int?, String?), но они решают разные задачи:
nil — это всегда реальное значение.// Параметр по умолчанию — всегда реальное значение внутри функции
func greet(name: String = "friend") {
print("Hello, \(name)!")
}
// Опционал — может быть nil, функция должна проверить
func greet(name: String?) {
if let name = name {
print("Hello, \(name)!")
} else {
print("Hello, friend!")
}
}Оба вызова greet() могут вывести «Hello, friend!», но достигают этого по-разному. Смешение этих концепций может привести к лишним проверкам if let, когда достаточно было бы параметра по умолчанию.
Параметры по умолчанию — одна из тех возможностей, которые кажутся мелкими, но встречаются повсюду: и в твоём коде, и в стандартной библиотеке Swift. Главная идея проста: сделай частый случай простым, но оставь возможность для настройки.
Прямо сейчас открой свой проект и найди функцию, где ты передаёшь один и тот же аргумент в 90% вызовов. Сделай его параметром по умолчанию — и код станет чище. Попробуй!
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →