簡體   English   中英

在 SwiftUI 視圖中將子類綁定到父 class 時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM