本文介绍了多态和SwiftUI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
给出以下示例:
class ProfileTab: Identifiable {
let id = UUID()
let name: String
init(name: String) {
self.name = name
}
}
class ProfileQuoteTab: ProfileTab {
let answer: String
let prompt: String
init(name: String, answer: String, prompt: String) {
self.answer = answer
self.prompt = prompt
super.init(name: name)
}
}
class ProfileImageTab: ProfileTab {
let image: Image
init(name: String, image: Image) {
self.image = image
super.init(name: name)
}
}
struct ContentView: View {
let tabs: [ProfileTab] = [
ProfileQuoteTab(name: "This is a quote tab", answer: "This is an answer", prompt: "This is a prompt"),
ProfileImageTab(name: "This is an image tab", image: Image(systemName: "faceid"))
]
var body: some View {
List(self.tabs) { tab in
VStack {
if tab is ProfileQuoteTab {
Text((tab as! ProfileQuoteTab).answer)
}
if tab is ProfileImageTab {
(tab as! ProfileImageTab).image
}
}
}
}
}
在我的ProfileTab
数组中是否有更好/推荐的方法来访问不同类的属性?
Is there a better/recommended way of accessing properties on different classes within my ProfileTab
array?
我知道这样做会导致:
if let profileImage = tab as? ProfileImage {
...
}
有没有一种更清洁的方法,而不是执行以下操作?
Is there a cleaner way rather than doing the following?
(tab as! ProfileImageTab).image
推荐答案
在所描述的用例中,多态性看起来类似于以下内容(或某些变体):
In the described use-case the polymorphism would look like the following (or in some variations):
class ProfileTab: Identifiable {
let id = UUID()
let name: String
init(name: String) {
self.name = name
}
func view() -> AnyView {
AnyView(EmptyView())
}
}
class ProfileQuoteTab: ProfileTab {
let answer: String
let prompt: String
init(name: String, answer: String, prompt: String) {
self.answer = answer
self.prompt = prompt
super.init(name: name)
}
override func view() -> AnyView {
AnyView(Text(self.answer))
}
}
class ProfileImageTab: ProfileTab {
let image: Image
init(name: String, image: Image) {
self.image = image
super.init(name: name)
}
override func view() -> AnyView {
AnyView(self.image)
}
}
struct ContentView: View {
let tabs: [ProfileTab] = [
ProfileQuoteTab(name: "This is a quote tab", answer: "This is an answer", prompt: "This is a prompt"),
ProfileImageTab(name: "This is an image tab", image: Image(systemName: "faceid"))
]
var body: some View {
List(self.tabs) { tab in
VStack {
tab.view()
}
}
}
}
这篇关于多态和SwiftUI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!