多态性和 SwiftUI

Polymorphism and SwiftUI(多态性和 SwiftUI)
本文介绍了多态性和 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Why local notification is not firing for UNCalendarNotificationTrigger(为什么没有为UNCalendarNotificationTrigger触发本地通知)
Pushing UIViewController above UITabBar(将UIView控制器推送到UITabBar上方)
Dropbox Files.download does not start when number of files in folder is gt; 1000(当文件夹中的文件数为1000时,Dropbox Files.Download不会启动)
appearance().setBackgroundImage Not Working On Custom Class(外观().setBackoundImage在自定义类上不起作用)
Show/Hide barButtonItem(显示/隐藏barButtonItem)
java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type(异常:不应为错误类型创建SimpleTypeImpl)