Протокол 'Просмотр' может использоваться только как общее ограничение, потому что он имеет Self или требования к связанному типу - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь передать целевой View Struct другому представлению, но код не скомпилируется.

Я хочу передать некоторую структуру, соответствующую протоколу представления, чтобы ее можно было использовать в пункте назначения навигационной кнопки, но я не могу заставить ее скомпилироваться. Я также попытался установить тип назначения _View. Любые предложения приветствуются.

struct AnimatingCard : View {

    var title, subtitle : String
    var color : Color
    var destination : View

    init(title : String, subtitle: String, color: Color, destination : View){
        self.title = title
        self.subtitle = subtitle
        self.color = color
        self.destination = destination


    }

    var body: some View {
        NavigationButton(destination: destination) {
    ...
        }
   }
}

1 Ответ

3 голосов
/ 18 июня 2019

Если не существует общего конкретного типа, который был бы у всех представлений, используемых в destination, вы должны использовать структуру AnyView, чтобы получить стертый тип бетона View соответствующий объект.

ETA:

AnyView имеет инициализатор, объявленный как init<V>(_ view: V) where V : View, поэтому, где бы вы ни создавали свой AnimatingCard, прежде чем вы должны написать:

AnimatingCard(title: title, subtitle: subtitle, color: color, destination: AnyView(view))

В качестве альтернативы, вы можете сделать инициализатор AnimatingCard универсальным для всех View -подобных типов и выполнить преобразование AnyView внутри инициализатора, например:

init<V>(title : String, subtitle: String, color: Color, destination : V) where V: View {
    self.title = title
    self.subtitle = subtitle
    self.color = color
    self.destination = AnyView(destination)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...