Почему я быстро получаю 'X не конвертируется в TY'? - PullRequest
0 голосов
/ 08 октября 2019

Я получаю сообщение об ошибке «StreamingModel» не конвертируется в «T.EAModel» в следующем фрагменте кода. Может кто-нибудь помочь мне понять ошибку.

public struct GraphViewsMainSUI<T> : View where T: GraphViewRepresentableProtocol {

    @ObservedObject public var graphToggle: GraphToggle
    @ObservedObject public var model: StreamingModel

    public var body: some View {
        HStack {
            VStack {
                Text("Select Graphs").font(.headline)
                GroupBox{
                    GraphChecksSUI(toggleSets: $graphToggle.toggleSets)
                }
            }.padding(.trailing, 35)
            T(model: model, toggleSets: $graphToggle.toggleSets)   <<<< COMPILE ERROR HERE
        }.frame(minWidth: 860, idealWidth: 860, maxWidth: .infinity, minHeight: 450, idealHeight: 450, maxHeight: .infinity).padding()
    }
}

public protocol GraphViewRepresentableProtocol: NSViewRepresentable  {

    associatedtype EAModel

    init(model: EAModel, toggleSets: Binding<[GraphToggleSet]>)

}

Структура, которую я использую для типа T, который соответствует GraphViewRepresentable, следующая:

public struct GraphViewRepresentable: NSViewRepresentable, GraphViewRepresentableProtocol {    

    public var model: StreamingModel
    @Binding public var toggleSets: [GraphToggleSet]

    public init(model: StreamingModel, toggleSets: Binding<[GraphToggleSet]>) {
        self.model = model
        self._toggleSets = toggleSets
    }
    ...
}

В протоколе связанный типне имеет ограничений, поэтому я не понимаю, почему компилятор не устанавливает тип EAModel в StreamingModel.

1 Ответ

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

Здесь:

T(model: model, toggleSets: $graphToggle.toggleSets)

Вы предполагаете, что, что бы T ни было, имеет связанный тип EAModel == StreamingModel, что не обязательно верно. Я мог бы передать такой тип:

struct Foo : GraphViewRepresentableProtocol {
    typealias EAType = Int
    init(model: EAModel, toggleSets: Binding<[GraphToggleSet]>) { }
}

И ваш код сломался бы.

Возможно, вам нужно ограничить T дальше набором типов, который имеет EAModel == StreamingModel:

public struct GraphViewsMainSUI<T> : View where T: GraphViewRepresentableProtocol, T.EAModel == StreamingModel {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...