Swift — можете ли вы создавать условные переменные?

Можно ли условно изменить значение переменной?

У меня есть структура меню, которая должна отображаться по-разному в зависимости от того, были ли выполнены какие-либо вычисления, активный = истина/ложь.

Ниже приведено то, что я ХОЧУ написать, но ясно, что вы не можете поместить условное выражение в оператор var. Как я мог этого добиться?

struct Results: Identifiable {
var id = UUID().uuidString
var category: String
var active: Bool
}

var results = [
    if GlobalVariables.calculated == true {
        Results(category: "Results", active: true)
    } else {
        Results(category: "Results", active: false)
    }
]

Как насчет использования вычисляемого свойства? Похоже, это было бы уместно в данной ситуации. Вы хотите, чтобы results имел соответствующее значение active каждый раз, когда вы к нему обращаетесь, верно?

Sweeper 30.04.2023 09:00

Вы объявили его как изменяемый массив, значит ли это, что вы хотите добавить больше значений?

Joakim Danielson 30.04.2023 10:22

Mutable = нет - спасибо - это изменится.

Edward Hasted 01.05.2023 09:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

var results = [ GlobalVariables.calculated ? Results(category: "Results", active: true) : Results(category: "Results", active: false)
]

print("---> results: \(results) \n")

В итоге я использовал следующий синтаксис: (GlobalVariables.calculated ? true : false)

Edward Hasted 04.05.2023 17:36

Лучшим выбором является использование вычисляемого свойства

var results : [Results] {
     return [Results(category: "Results", active: GlobalVariables.calculated)]
}

или, если results предполагается инициализировать только один раз, свойство lazy

lazy var results : [Results] = {
     return [Results(category: "Results", active: GlobalVariables.calculated)]
}()

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

calculated может быть необязательным в оп.
Mojtaba Hosseini 30.04.2023 09:29

@MojtabaHosseini Если да, добавьте == true

vadian 30.04.2023 09:33

Я упростил массив для целей вопроса. Есть 25 строк и 6 столбцов/элементов. Должен ли я по-прежнему следовать этому подходу?

Edward Hasted 01.05.2023 09:10

Если конфигурация может измениться, используйте вычисляемое свойство, в противном случае — ленивое инстанцированное свойство.

vadian 01.05.2023 09:19

Поскольку массив var велик, эти подходы громоздки. Вместо этого я выбрал более простой метод, который состоит в том, чтобы загрузить базовые переменные, а затем выполнить условный тест в .onAppear и, если false, изменить требуемые значения по мере необходимости, например. результаты[25].актив = ложь. Это работает, и значения изменяются правильно, но результаты этих атрибутов на экране не изменились. Есть ли способ перезагрузить новые значения в представлении? Пытался изменить все на переменную @State, но это потребует большого рефакторинга.

Edward Hasted 04.05.2023 08:19

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

vadian 04.05.2023 08:36

Я ожидал, что ответ будет более сложным, чем он был. В конце концов я подал в суд на этот синтаксис: (GlobalVariables.calculated ? true : false). Спасибо за помощь.

Edward Hasted 04.05.2023 17:38

Другие вопросы по теме