SwiftUI — Многократное Повторение

#swiftui #repeat

Вопрос:

Мне нужно отображать определенный текст для каждого дня года, когда я повторяю код около 30 раз, все в порядке, если я расширяю код на каждый день 365 раз, я получаю ошибку.

Код:

 if ("(formatDate(date: today))") .elementsEqual("01-01"){
                                Text("Lucy")
                            }
                    else if ("(formatDate(date: today))") .elementsEqual("02-01"){
                                Text("Karl")
                            }
                    else if ("(formatDate(date: today))") .elementsEqual("03-01"){
                                Text("Jack")
                            }
                    else if ("(formatDate(date: today))") .elementsEqual("04-01"){
                                Text("Tim")
                            }
                    else if ("(formatDate(date: today))") .elementsEqual("05-01"){
                                Text("Sarah")
                            }
// and so on ... 365x
 

Ошибка:

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

Комментарии:

1. Действительно ли нет более эффективного способа достичь желаемых результатов, чем организация с 365 филиалами? if/else Действительно ли то Text , что вы генерируете, на 100% уникально для каждого конкретного случая, или есть функция, которую вы можете использовать для генерации на Text основе результата, который вы ищете?

2. Текст на 100% уникальное имя для каждого дня.

Ответ №1:

Я думаю , что самый простой способ-это настроить a Dictionary<String,String> , где ключ-это отформатированная дата, а значение-результирующий текст:

 let dateTextDictionary = [
    "01-01":"Lucy",
    "02-01":"Karl",
    "03-01":"Tim",
]
 
 if let resultText = dateTextDictionary[formatDate(date: today)] {
    Text(resultText)
}
 

Этот словарь также может быть загружен из файла JSON или plist.

Ответ №2:

Скорее всего, ваша программа слишком неэффективна. Если я правильно понимаю ваш вопрос, вот что я бы сделал:

 var texts = ["Lucy", "Karl", "Jack", "Tim", "Sarah"] //and so on with whatever texts you are using.
for x in 1...365 {
   if x < 10 {
      if ("(formatDate(date: today))") .elementsEqual("0(x)-01"){
                                Text("(texts[x-1])")
                            }
   } else {
      if ("(formatDate(date: today))") .elementsEqual("(x)-01"){
                                Text("(texts[x-1])")
                            }
   }

}
 

Комментарии:

1. Вам не хватает () знаков интерполяции в вашем Text s