Почему я получаю сообщение об ошибке при использовании ForEach в Xcode 11 Beta 5?

Сообщение об ошибке:

Не удалось вывести универсальный параметр "ID"

ForEach(0...self.workoutsViewModel.workoutRoutine[self.workoutIndex].routine[0].exercises.count - 1) { x in

    Text("\\(x)")

}

person Maric Vikike    schedule 04.08.2019    source источник
comment
Это слишком мало информации, чтобы кто-то мог вам помочь.   -  person SWAT    schedule 04.08.2019


Ответы (2)


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

struct MyModel {
    let name: String
}

struct ContentView: View {
    let models: [MyModel]

    var body: some View {
        ForEach(models) { model in
            Text(model.name)
        }
    }
}

Массив models не удовлетворяет требованиям инициализатора ForEach, а именно его элементы не соответствуют Identifiable. Я могу решить эту проблему одним из двух способов:

1.) Расширить MyModel, чтобы соответствовать Identifiable:

extension MyModel: Identifiable {
    // assuming `name` is unique, it can be used as our identifier
    var id: String { name }
}

2.) Используйте удобный инициализатор на ForEach, который позволяет вам указать KeyPath для вашего идентификатора:

var body: some View {
    ForEach(models, id: \.name) { model in
        Text(model.name)
    }
}
person daltonclaybrook    schedule 04.08.2019

Ответ @daltonclaybrook великолепен, потому что он объясняет, почему вы получаете эту ошибку, и иллюстрирует правильный подход к созданию пользовательской модели. Но если вы ищете временное, быстрое и грязное решение, это работает для меня в Xcode 11.2.1 и iOS 13.2 для массива String:

ForEach(strings, id: \.self) { string in
   ...
}
person andrewz    schedule 27.11.2019