Оператор в теле закрытия SwiftUI вызывает ошибку типа - PullRequest
2 голосов
/ 31 января 2020

Этот модификатор в представлении SwiftUI компилируется нормально:

.background(GeometryReader { p in
    return Rectangle().opacity(0)
})

(я знаю, что мне не нужен возврат, но я собираюсь добавить еще одну строку.)

Когда Я добавляю вызов print, он больше не компилируется.

.background(GeometryReader { p in
    print("hi")
    return Rectangle().opacity(0)
})

Ошибка указывает на background и говорит:

Тип выражения '(_, Выравнивание) - «Некоторый взгляд» неоднозначен без дополнительного контекста

Я не понимаю, почему он теперь смущен из-за типа вещи, передаваемой .background(...). У него такое же ясное return выражение, как и раньше. Как я могу исправить код, чтобы удовлетворить проверку типа?

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Эта ошибка возникает из-за того, что закрытия нескольких операторов не участвуют в выводе типа . Параметр Content generi c инициализатора GeometryReader не может быть выведен, потому что единственная информация, которую вы ему предоставляете, замыкание, не рассматривается для вывода типа!

Так что вам просто нужно укажите, какой тип вы возвращаете:

.background(GeometryReader {
    p -> Rectangle in // note here
    print("Hello")
    return Rectangle()
})

Вы, вероятно, не должны этого делать, потому что вы должны поместить только View s в замыкание построителя представлений. SwiftUI разработан, чтобы быть очень декларативным, я бы сказал, почти собственный DSL.

Редактировать: я нашел этот ответ , который добавляет View с именем Print. Я думаю, вы можете поместить один из них рядом с любым видом, на котором вы устанавливаете фон, в Group.

1 голос
/ 31 января 2020

При написании собственного модификатора я смог создать фон для представлений. Sweeper, я думаю, имеет правильную идею, вам нужно добавить оператор return, потому что считыватель геометрии больше не является неявным возвратом из одной строки.

extension View {
  func myBackground() -> some View {
    print("hi")
    return background(GeometryReader { geometry in
      Rectangle().path(in: geometry.frame(in: .local))
    })
  }
}

Затем я протестировал модификатор в контексте ниже.

struct ContentView: View {

  var body: some View {
    Text("Foreground Label").foregroundColor(.green).myBackground()
  }

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