Hi I was just wondering is it possible to create a generic class confirming to ObservableObject protocol which can be used by more then one ContentViews.
If i can do that then I will be able make my ContentView and Model class completely generic and reusable.
An example of what i would like to achieve:
protocol ContentViewModelType: ObservableObject {
var propertyToInitialiseView: [String] { get }
}
struct ContentView: View {
@ObservedObject var viewModel: some ViewModel
var body: some View {
Text("Hello World")
}
}
If I can do that any class can implement ContentViewModelType and become a model for ContentView which makes it generic and reusable. For example
class ViewModel: ObservableObject {
var objectWillChange = PassthroughSubject<ViewModel, Never>()
}
But when i try to initialise ContentView that xcode gives me a type error.
I thought the whole point of introducing some keyword was so that we can use protocol as type for those protocols that have associated type as a requirement and hence this should work. But it gives an error.
If anyone has any references or knowledge about this problem that they could share or possibly a solution for this it would be great.
Thanks in advance.
Trying to understand your question, and I am not quite sure I understand the intent... but to create a view which takes in generic view model (based on the protocol you had before) you will need the following code:
protocol ViewModelWithProperties: ObservableObject {
var properties: [String] { get }
}
struct SomeView<T>: View where T: ViewModelWithProperties {
// this can also be written as
// struct SomeView<T: ViewModelWithProperties>: View {
@ObservedObject var item: T
var body: some View {
VStack {
ForEach(item.properties, id: \.self) {
Text($0)
}
}
}
}
To consume this instance you will need to:
struct ContentView: View {
var body: some View {
SomeView(item: MyViewModel())
}
}
As stated in one of the other answers, some
is used for opaque types, it doesn't make your code generic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With