Невозможно определить сложный тип возврата замыкания с SwiftUI

Следуя части 3 руководства Apple по SwiftUI, Обработка пользовательского ввода, я получаю эту ошибку:

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

Я использую тот же код, что и в руководстве (даже копирование из примера кода "Complete" не устраняет ошибку).

У кого-нибудь есть подсказка, что здесь происходит не так?

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image(forSize: 50)
            Text(verbatim: landmark.name)
            Spacer()

            if landmark.isFavorite {
                Image(systemName: "star.fill")
                    .imageScale(.medium)
            }
        }
    }
}

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

-

Обновить

Очевидно, вы не должны продолжать свой результат 2-го учебника с 3-м. Некоторые вещи изменились между уроками, которые не описаны в уроке. Я добавил файлы проекта в Github, чтобы вы могли проверить diff.

Лучше начать третий урок заново с новой загрузки файлов проекта из 3-го урока.

2 ответа

Решение

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

Это не заявлено на Landmark тип, и компилятор вместо того, чтобы показать необъявленную ошибку свойства, не может разрешить тип возврата закрытия стека, поэтому он показывает и ошибку там.

Отличная работа Apple, учебники и еще лучше один компилятор Xcode11.

Чинить:

  1. декларировать isFavorite переменная на Landmark тип.
  2. Убедитесь, что вы обновили landmarkData.json для каждого ориентира записи с isFavorite = false запись, в противном случае приложение будет зависать во время выполнения.

Некоторые предыстории этой проблемы

Как уже ответил @dirtydanee, между этими двумя учебниками есть разница. Но проблема в том, что, несмотря на то, что, похоже, вы выполняете конфигурацию, на самом деле это просто функции, вложенные в функции с использованием обобщений и протоколов, которые "волшебным образом" анализируют все в функции компиляции.

Однако соответствие этим универсальным шаблонам и протоколам должно быть довольно точным, потому что, если не все дерево функций больше не может компилироваться. Но для компилятора сложно определить, какое соответствие на самом деле не удалось. Вот почему вы видите ошибку сверху, а не там, где она действительно происходит.

Настоятельно рекомендуется убедиться, что ваши представления разбиты на естественные и простые блоки, чтобы вы не проливали сотни строк View код, чтобы найти эту ошибку.

Dave DeLong был действительно хороший разговор о том, как составлять представления из ViewControllers, который остается верным до сегодняшнего дня: в основном вы никогда не используете View как подпредставление внутри другого View, но вам нужно разложить ваш View на множество простых представлений. В противном случае эти ошибки сведут вас с ума.

Для людей, получающих эту ошибку в SwiftUI и ищущих способ отладки своего стека представлений

Эта ошибка возникает в основном при возникновении проблемы с компиляцией одного дочернего представления.

1 - Убедитесь, что ваше родительское представление может поддерживать несколько подпредставлений (VStack, ZStack) и у вас меньше 10 подвидов. Иногда вам может понадобиться добавить оболочку группы.

2 - Если проблема не в этом, вероятно, проблема связана с одним подпредставлением. Постарайтесь выделить того, кого вы подозреваете в проблеме. Обычно я копирую subview в свойство, и появляется другая ошибка

var debug: some View {
        MyViewWithError(property: self.property)
}

В большинстве случаев вы столкнетесь с этим, потому что передадите свойство (self.property) вместо привязки (self.$property)

Надеюсь, это поможет некоторым людям

Я столкнулся с проблемой в подпредставлении, где опора @Binding была другого типа источника @Binding.

Я столкнулся с этой ошибкой, когда сделал опечатку. Также эта ошибка появляется, когда код имеет проблемы с синтаксисом. Просто проверьте правильность ваших изменений

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