[英]Binding @Published property of parent view's viewModel to @Published property of child view's viewModel: SwiftUI
[英]Problem binding a subclass to parent class in SwiftUI View
我一直在嘗試嘗試將子類綁定到 SwiftUI 視圖,該視圖將其父 class 作為參數。
這些是我的課:
class Animal {
func sound() -> String {
return ""
}
}
class Cat : Animal {
override func sound() -> String {
return "Meow"
}
func purr() {
print("purring")
}
}
class Dog : Animal {
override func sound() -> String {
return "Woof"
}
func fetch() {
print("fetching")
}
}
這是我設置的視圖。
struct ContentView: View {
@State var creature:Cat = Cat()
var body: some View {
AnimalView(creature: $creature)
}
}
struct AnimalView: View {
@Binding var creature:Animal
var body: some View {
Text(creature.sound())
.padding()
}
}
這會導致編譯錯誤:
Cannot convert value of type 'Binding<Cat>' to expected argument type 'Binding<Animal>'
綁定到需要父 class 的視圖的正確方法是什么?
環顧四周,我認為我想要的結構是使視圖本身具有通用性。
struct ContentView: View {
@State var creature:Cat = Cat()
@State var creature2:Dog = Dog()
var body: some View {
VStack {
AnimalView(creature: $creature)
AnimalView(creature: $creature2)
}
}
}
struct AnimalView<T:Animal> : View {
@Binding var creature:T
@State var sound:String = "No Sound"
var body: some View {
Text(creature.name)
.padding()
.onAppear {
self.sound = self.creature.sound()
}
}
}
這將允許我綁定到從 Animal 繼承的類型,並讓我使用一個視圖,而不必創建單獨的 Cat 和 Dog 視圖。
同樣為了更好的形式,這里的協議和類也是一樣的。
protocol Animal {
var name:String {
get
}
func sound() -> String
}
struct Cat : Animal {
var name:String {
get {
return "Cat"
}
}
func sound() -> String {
return "Meow"
}
func purr() {
print("purring")
}
}
struct Dog : Animal {
var name:String {
get {
return "Dog"
}
}
func sound() -> String {
return "Woof"
}
func fetch() {
print("fetching")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.