gpt4 book ai didi

swift - 在 Swift 中使用枚举作为 Programming to Protocols 的一部分

转载 作者:行者123 更新时间:2023-11-28 13:27:58 24 4
gpt4 key购买 nike

我想要一组不同的页面(HTML 和 PDF 页面,以后可能会添加更多)。

我认为这是练习使用协议(protocol)编程的好机会。

这是我想出的:

protocol PageDataProtocol {
var data: String? {get}
}

protocol PageTitleProtocol {
var title: String {get}
var pageType: Page {get}
}

struct PDFData: PageTitleProtocol {
var title: String
var pageType: Page
}

struct HTMLData: PageDataProtocol, PageTitleProtocol {
var title: String
var data: String?
var pageType: Page
}

enum Page {
case html
case pdf
case links
}


var pageArray : [PageTitleProtocol]? = []

let test = PDFData(title: "title1", pageType: .html)
pageArray?.append(test)

let testtwo = HTMLData(title: "title2", data: "hello", pageType: .pdf)
pageArray?.append(testtwo)


for page in pageArray! {
print (page.title)
if let pg = page as? HTMLData {
print (pg.data)
}

if page.pageType == .pdf {
print ( (page as? HTMLData)?.data )
}
}

一切似乎都很好,但在我的打印语句中有一个明显的问题。

编辑:我不认为上面的代码是完美的。但是在回答下面的问题时,pageArray 是可选的,因为在从 API 下载之前可能没有页面,但这与没有从 API 提取的页面不同。

存储枚举没有意义,因为无论如何我都必须转换为正确的类型。

这样做的想法是,我可以将页面存储在单个数组中,根据需要获取它们,然后显示在我的 View Controller 中(由我的 View 模型格式化),而不是从 2 个以上具有不同类型的数组中绘制.

我想写一个很好的 case 语句来正确显示信息(在我完成的结构中会有其他字段)但是这对我的实现来说似乎是不可能的。

我如何重构代码以能够打开上面声明的页面类型?

最佳答案

如果您的页面数据是预定义的并从头开始密封,您甚至根本不需要 protocol(它甚至会适得其反),只需扩展您的 enum:

enum Page {
case html(title: String, data: String?)
case pdf(title: String)
case links(title: String, array: [URL]) // or something else, it wasn't used in the example

var title: String {
switch(self) {
case .html(let title, _), .pdf(let title), .links(let title, _):
return title
}
}
}

var pageArray : [Page] = [] // no need to make it optional, btw

let test = Page.pdf(title: "title1")
pageArray.append(test)

let testtwo = Page.html(title: "title2", data: "hello")
pageArray.append(testtwo)

for page in pageArray {
print (page.title)

if case .html(_, let data) = page {
print(data)
}
}

关于swift - 在 Swift 中使用枚举作为 Programming to Protocols 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com