1. Базовий синтаксис вкладеного if
У реальному житті рідко трапляється ситуація, коли рішення ухвалюють лише за одним критерієм. Зазвичай доводиться перевіряти відразу кілька умов, і вони часто залежать одна від одної. Наприклад, щоб потрапити на концерт, недостатньо просто бути дорослим — інколи потрібно ще й бути в списку запрошених. Саме тут і стає в пригоді так звана багаторівнева логіка, а реалізувати її допомагають вкладені оператори if.
Вкладені умови — це коли один if «живе» всередині іншого. Уявіть собі коробку в коробці: якщо перша коробка відкрилася (умова виконалася), тоді дивимося, що всередині, і, можливо, відкриваємо другу. З погляду коду та логіки це дуже потужний інструмент.
Почнімо з простого:
if (умоваА)
{
// дії, якщо умоваА — true (істина)
if (умоваБ)
{
// дії, якщо обидві умови істинні
}
}
if усередині іншого
if
Якщо ця конструкція нагадує вам коробки одна в одній — ви все розумієте правильно. Вкладений if усередині зовнішнього виконуватиметься лише тоді, коли спрацював зовнішній.
Приклад: вхід до клубу
Спробуймо розвинути наш навчальний застосунок, у якому користувач раніше вводив імʼя та вік. Тепер додамо другий рівень перевірки. Припустімо, щоб потрапити в закритий клуб, потрібно бути віком від 21 року і мати запрошувальний код.
fun main() {
print("Введіть ваше імʼя: ")
val name = readln()
print("Введіть ваш вік: ")
val age = readln().toInt()
if (age >= 21) {
print("Введіть запрошувальний код: ")
val code = readln()
if (code == "VIP2026") {
println("Ласкаво просимо, $name, до VIP-клубу!")
} else {
println("Вибачте, неправильний код. Доступ заборонено.")
}
} else {
println("Вибачте, вхід лише з 21 року!")
}
}
Зверніть увагу: внутрішній if перевіряє код лише тоді, коли вік уже пройшов перевірку. Це заощаджує ресурси (і не нервує охоронця).
2. Скільки рівнів вкладеності допустимо?
Технічно — скільки завгодно. Але на практиці що більше рівнів вкладеності, то важче читати й підтримувати такий код. Зазвичай намагаються не виходити за межі 2–3 рівнів. Якщо ж у вас зʼявляються «сходинки» з 4 і більше вкладених if, варто замислитися: можливо, логіку можна спростити або винести частину перевірок в окремі функції (але це тема іншої лекції).
3. Вкладені if і else: пастки та нюанси
Типова помилка новачків: недбале оформлення фігурних дужок.
Коли ви пишете вкладені умови, особливо з else, Kotlin суворо дотримується правил синтаксису. Якщо не додати фігурні дужки {}, то до if або else належить лише перший рядок після них. Це часте джерело прикрих багів.
Приклад із потенційною помилкою:
if (age >= 21)
if (code == "VIP2026")
println("Ласкаво просимо!");
else
println("Неправильний код.");
Багато хто очікує, що else належить до перевірки віку. Насправді ж воно належить до найближчого перед ним if — тобто до перевірки запрошувального коду. Через це повідомлення можуть зʼявлятися не так, як ви очікували. Тому краще завжди ставити фігурні дужки — навіть якщо всередині лише один рядок.
Щоб не було плутанини, покажу ще раз. Компілятор сприймає код вище ось так:
if (age >= 21)
{
if (code == "VIP2026")
println("Ласкаво просимо!");
else
println("Неправильний код.");
}
Важливо! Ще раз: Якщо в конструкції if-else не розставлені фігурні дужки, else належить до попереднього (найближчого до нього) if.
4. Альтернативи: else if у вкладених умовах
Іноді всередині зовнішнього if хочеться не лише перевірити одну додаткову умову, а й передбачити альтернативу. Наприклад, якщо запрошувальний код не підійшов, можна запропонувати купити квиток. Для цього використовують вкладену конструкцію else if/else:
fun main() {
print("Введіть ваш вік: ")
val age = readln().toInt()
if (age >= 21) {
print("Введіть запрошувальний код: ")
val code = readln()
if (code == "VIP2026") {
println("Ласкаво просимо до клубу!")
} else if (code == "GUEST") {
println("Гостьовий режим: доступ лише до 23:00.")
} else {
println("На жаль, доступ неможливий.")
}
} else {
println("Вхід лише з 21 року.")
}
}
У цьому прикладі ми зробили вкладений вибір між трьома сценаріями: VIP-код, гостьовий код і відмова.
5. Практика: калькулятор знижки з багаторівневою логікою
Напишімо невеликий застосунок: користувачу нараховується знижка в магазині на основі віку та наявності клубної картки.
- Якщо вік користувача більший або дорівнює 60 — знижка 15 %.
- Якщо вік менший, але в користувача є клубна картка — знижка 7 %.
- В інших випадках знижки немає.
Як це оформити?
fun main() {
print("Введіть ваш вік: ")
val age = readln().toInt()
var discount = 0.0
if (age >= 60) {
discount = 0.15
} else {
print("Чи є у вас клубна картка (так/ні)? ")
val hasCard = readln()
if (hasCard == "так") {
discount = 0.07
}
}
println("Ваша знижка: ${discount * 100}%")
}
Тут ми використали вкладений if усередині гілки else. Якщо вік не підійшов, лише тоді запитуємо про картку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ