SwiftUI, используя аргумент ForEach, вызывающий ошибку «Невозможно определить тип закрытия» - PullRequest
0 голосов
/ 12 октября 2019

У меня есть простая структура View, в которой есть массив AnyView. В body я пытаюсь перебрать массив с помощью ForEach.

struct TestView<Content>: View where Content : View
{
    var Cells: [AnyView] = []

    init<Data: RandomAccessCollection, ID, Item: View>(
        @ViewBuilder content: () -> Content)
        where Content == ForEach<Data, ID, Item>
    {
        let Views = content()
        Cells = Views.data.map { AnyView(Views.content($0)) }
    }

    func test(_ i: UInt) -> CGPoint
    {
        return CGPoint(x: 0.0, y: 0.0)
    }

    func test() -> CGPoint
    {
        return CGPoint(x: 0.0, y: 0.0)
    }

    var body: some View {
        ZStack {
            ForEach(0..<self.Cells.count, id: \.self) {i in
                Text("").position(self.test(i))
            }
        }
    }
}

Однако при компиляции он выдает ошибку в строке ForEach: «Невозможно определить тип замыкания в текущем контексте». Что вызывает эту ошибку?

Обратите внимание, что у меня есть 2 определения test(). Если я использую тот без аргумента, ошибка исчезнет. (почему ...?) Кроме того, если я заменю self.Cells.count на постоянное число (например, "10"), ошибка также исчезнет.

Я использую Xcode 11.1.

1 Ответ

1 голос
/ 12 октября 2019

Ваша проблема в том, что параметром теста является UInt, а тип 0..<self.Cells.count - Range<Int>, поэтому компилятор выводит i как Int. Когда вы передаете его в функцию, функция ожидает UInt, и компилятор не может неявно привести ее к типу от Int до UInt, поэтому вы должны это сделать. Вот один из способов сделать это:

var body: some View {
    ZStack {
        ForEach(0..<self.Cells.count, id: \.self) { i in
            Text("").position(self.test(UInt(exactly: i) ?? 0))
        }
    }
}

Другой способ решить вашу проблему - просто изменить параметр тестовой функции на тип Int и обработать приведение к UInt внутри него, есливам действительно нужно, чтобы это был UInt, а не просто Int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...