本文介绍了多态性和 SwiftUI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Given the following example:
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
}
}
}
}
}
Is there a better/recommended way of accessing properties on different classes within my ProfileTab
array?
I know doing this will result in:
Closure containing control flow statement cannot be used with function builder 'ViewBuilder'
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!