Найти в Дзене
Coding Corner

Тернарные операторы в Swift

Всем привет!) Сегодня темой статьи будут тернарные операторы. Как их можно использовать, для чего и чем они удобнее обычных условных выражений? Из своего опыта скажу, что сам поначалу не принимал их и не хотел пользоваться, однако со временем понял их плюсы для себя. И вот пара из них : Возможно их и больше, но честно скажу, не хочется останавливаться и специально думать над этим. Строение тернарного оператора : Проще всего объяснить его будет таким псевдокодом : (условие отвечающее true/false) ? (действие, если вернулось true) : (действие если вернулось false). Простой пример : 2 * 3 == 6 ? print("Correct!") : print("It's a fiction!") Перед знаком вопроса мы создаем условие, которое отвечает true/false. После знака вопроса мы пишем действие, если условие оказалось правдивым. После двоеточия мы пишем действие, если условие оказалось ложным. Давайте перейдем сразу к примеру с кодом. Пример будет разобран в декларативном фреймворке SwftUI. --> Поехали. Задача. Нам дан простой прямоугол
Оглавление

Всем привет!)

Сегодня темой статьи будут тернарные операторы. Как их можно использовать, для чего и чем они удобнее обычных условных выражений?

Из своего опыта скажу, что сам поначалу не принимал их и не хотел пользоваться, однако со временем понял их плюсы для себя. И вот пара из них :

  • Позволяет прописывать простые условные выражения более компактно.
  • Позволяет записывать условные выражения практически в любые места кода (продемонстрирую в примерах).

Возможно их и больше, но честно скажу, не хочется останавливаться и специально думать над этим.

Строение тернарного оператора :

Проще всего объяснить его будет таким псевдокодом :

(условие отвечающее true/false) ? (действие, если вернулось true) : (действие если вернулось false).

Простой пример :

2 * 3 == 6 ? print("Correct!") : print("It's a fiction!")

Перед знаком вопроса мы создаем условие, которое отвечает true/false. После знака вопроса мы пишем действие, если условие оказалось правдивым. После двоеточия мы пишем действие, если условие оказалось ложным.

Давайте перейдем сразу к примеру с кодом. Пример будет разобран в декларативном фреймворке SwftUI. --> Поехали.

Задача.

Нам дан простой прямоугольник с углами 90 градусов и шириной 100. По нажатию на него нам нужно чтобы углы закруглялись а ширина увеличивалась на 50. Еще одно нажатие возвращает в исходное положение

Решим без тернарных операторов.

struct ContentView : View {

@State var isRounded : CGFloat = 0 // Задаем изначальные параметры

@State var rectWidth : CGFloat = 100

var body : some View {

Rectangle()

.frame(width : rectWidth)

.cornerRadius(isRounded)

.onTapGesture(count : 1) {

if isRounded == 0 && rectWidth == 100 {

isRounded = 20

rectWidth = 150

}

else {

isRounded = 0

rectWidth = 100

}

}

}

}

Готово! Мы сделали все по условию. Однако решить это можно еще проще и лаконичнее. В этом решении под каждый изменяемый параметр мы создали свой @State. При нажатии мы попадаем в условный оператор, который меняет значения на необходимые по условию и управляет потоком.

Решим с тернарными операторами.

struct ContentView : View {

@State var isTrue : Bool = false

var body : some View {

Rectangle()

.frame(width : isTrue ? 150 : 100)

.cornerRadius(isTrue ? 20 : 0)

.onTapGesture(count : 1) {

isTrue.toggle()

}

}

}

В этом примере мы использовали только один @State и с помощью тернарных операторов привязали к его состоянию другие параметры. Таким образом мы избавились от одного @State, избавились от записи if - else в блоке onTapGesture() и сократили количество кода.

И самое главное преимущество - мы получили возможность управления потоком внутри модификаторов. Так как блок if - else достаточно объемный - мы не можем вместить его внутрь скобок. В то время как запись через "? :" отлично туда вмещается. Я достаточно часто использую такой метод при создании своих анимаций вместе с Combine.

Итог :

По началу тернарные операторы могут показаться вам неудобными, но если вы попрактикуетесь и привыкнете к ним - вы найдете их гораздо более практичными и привлекательными в определенных ситуациях.

Благодарю за внимание!