Почему swift дает ошибку компилятора после обновления?

Я работаю над проектом электронной коммерции, и теперь я разрабатываю страницу корзины. Я создал 4 степпера для определения количества продуктов. Я создал ярлыки, чтобы показать стоимость каждого продукта и один ярлык для общей стоимости.

@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
@IBOutlet weak var label3: UILabel!
@IBOutlet weak var label4: UILabel!
@IBOutlet weak var label5: UILabel!

@IBAction func GmS1(_ sender: GMStepper) {
    label1.text = String(sender.value*1.5)
}

@IBAction func GmS2(_ sender: GMStepper) {
    label2.text = String(sender.value*0.89)
}

@IBAction func GmS3(_ sender: GMStepper) {
    label3.text = String(sender.value*26)
}

@IBAction func GmS4(_ sender: GMStepper) {
    label4.text = String(sender.value*4)
}
func calculateSum() {
    label5.text = String([label1, label2, label3, label4].reduce(0,{$0 + (Double($1.text ?? "0") ?? 0)}))
}

Функция calculateSum () решала мою проблему, но после обновления swift этот код дает следующую ошибку:

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

Кто-нибудь знает, как это решить?

Всего 1 ответ


Когда вы видите эту ошибку, обычно это означает, что в этой строке кода есть (тип) ошибка. Вам нужно разбить эту конкретную строку на несколько отдельных операторов, чтобы компилятор мог быстрее рассуждать об этом. В вашем коде может быть не всегда ошибка, но у компилятора есть ограничение по времени для решения одиночных выражений, и если выражение слишком сложное, оно может пройти через это ограничение времени. В этом случае вам нужно разбить выражение на отдельные выражения, чтобы компилятор мог решить каждое выражение отдельно.

Если вы перемещаете объявление массива, содержащего ваши метки, в отдельную строку, компилятор сможет решить это выражение в разумные сроки.

func calculateSum() {
    let labels: [UILabel] = [label1, label2, label3, label4]
    label5.text = String(labels.reduce(0,{$0 + (Double($1.text ?? "0") ?? 0)}))
}