Невозможно определить сложный тип возврата замыкания с SwiftUI - PullRequest
4 голосов
/ 04 июня 2019

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

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

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

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

enter image description here

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 ]

10 голосов
/ 05 июня 2019

Проблема не в закрытии, а в свойстве isFavorite на ориентире.

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

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

Исправить:

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

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

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

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

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

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

...