Да, есть, но это не очень красиво.
Вы столкнулись с проблемами, так как компилятор не может понять, как он вообще может определить, какой тип что это some protocol
должно быть.
Причина, по которой some
работает при объявлении вашего представления, заключается в том, что он выводится из типа того, что вы ему предоставляете.
Если вы сделаете ваше представление структурированным универсальный тип c viewmodel, тогда вы можете получить его и скомпилировать.
struct MyView<ViewModel: ViewModelProtocol>: View {
@EnvironmentObject var viewModel: ViewModel
var body: some View {
Text(viewModel.greetings)
}
}
Облом здесь, это то, что теперь вы должны объявлять тип viewmodel всякий раз, когда вы используете эта точка зрения, вот так:
let test: MyView<ConcreteViewModel> = MyView()