#ios #swift #iphone
Вопрос:
Я разрабатываю приложение для iOS. Мне любопытно, как if {} else {}
условие работает с SwiftUI View.
import SwiftUI
struct SomeView: View {
let condition: Bool
var body: some View {
if condition {
...
} else {
...
}
}
}
Я хочу знать, генерируется ли код при отрицательном условии, но отключен ли он по if
условию? Если да, то можно ли построить такое представление, которое генерирует только код, соответствующий определенному условию? Sth с Лямбдой?
Я новичок в Swift, любые примеры были бы полезны, спасибо!
Комментарии:
1. Я бы сказал, что, поскольку это закрытие, весь код компилируется, но во время выполнения, когда закрытие вызывается для построения представления, выполняется только соответствующая ветвь
if
(в зависимости отcondition
).2. @D. Mika Приведенный выше код не содержит замыкания или чего-либо, что будет скомпилировано как замыкание.
3. @idmean Та часть, которая стоит прямо за
View
этим, — это закрытие.4. @D. Мика Нет, это вычисляемое свойство, а не замыкание. Смотрите
body
недвижимость в поле зрения . Закрытие-это значение, которое можно передавать по кругу. Нет никакого способа взять и передать вычисление функцииbody
, поэтому это не закрытие.5. @idmean: Ты прав. Моя вина.
Ответ №1:
SwiftUI использует конструктор результатов. Построители результатов позволяют преобразовывать каждый оператор выражения с помощью набора функций, т. е. они позволяют свести все операторы выражения к одному значению, которое затем является результатом функции.
Однако это не меняет семантику if-else, кроме логики, необходимой для переноса преобразованных результатов и объединения их в одно значение. Вы можете прочитать больше об этом здесь.
Таким образом, нет, блок if будет выполнен, если его условие будет оценено как true, а блок else, если условие будет оценено как false.
Комментарии:
1. Ладно, я понял. Значит, даже клозуры не помогут? Я хочу знать, должен ли я беспокоиться о том, что где-то внутри «работает», но скрытая часть кода. Я хотел бы пропустить это по очевидным причинам, таким как производительность и другие.
2. @MateuszKorga Чем помочь? Чего вы хотите достичь?
3. Я понял, что в обоих случаях результат будет сгенерирован, но одна из частей этого «html» будет скрыта. Так ли это? Или будет сгенерировано только истинное условие?
4. Выполняется только одна часть if, и возвращается сгенерированное представление. Там ничего не спрятано.
Ответ №2:
Хотя представления отображаются условно, типы все равно кодируются. Например:
struct ContentView: View {
var body: some View {
Group {
if true {
Color.blue
} else {
Text("You'll never see me!")
}
}
}
}
Кодируется как Group<_ConditionalContent<Color, Text>>
, даже если Text
он никогда не отображается.
Такие конкретные типы облегчают SwiftUI различение представлений — более полное объяснение см. в сеансе WWDC21 «Демистификация SwiftUI».