SwiftUI开发圣经APP:解决[Book]无name成员错误及嵌套数组展示问题
解决方案
报错原因与修复
你遇到的报错是因为 welcome.bible.book 是存储所有圣经书卷的数组类型 [Book],数组本身没有 name 属性,只有数组内的单个 Book 元素才持有 name 属性。你需要嵌套遍历多层数组,才能完整渲染书卷、章节、经文的层级内容。
优化模型(可选)
可以先把 Verse 里语义不明确的 empty 属性改为 content,仅需调整CodingKeys映射即可,无需修改原有JSON结构:
struct Verse: Decodable { let name, content: String enum CodingKeys: String, CodingKey { case name = "@name" case content = "$" } }
修正后的视图代码
import SwiftUI struct Scripture1: View { var welcome: Welcome var body: some View { ScrollView { VStack(alignment: .leading, spacing: 20) { // 展示译本名称 Text(welcome.bible.translation) .font(.largeTitle) .fontWeight(.bold) // 遍历所有书卷 ForEach(welcome.bible.book, id: \.name) { book in VStack(alignment: .leading, spacing: 10) { Text(book.name) .font(.title) .fontWeight(.semibold) // 遍历当前书卷的所有章节 ForEach(book.chapter, id: \.name) { chapter in VStack(alignment: .leading, spacing: 8) { Text("第\(chapter.name)章") .font(.headline) // 遍历当前章节的所有经文 ForEach(chapter.verse, id: \.name) { verse in HStack(alignment: .top, spacing: 4) { Text("\(verse.name).") .font(.subheadline) .foregroundColor(.secondary) // 如果你没有改Verse的属性名,这里换回verse.empty即可 Text(verse.content) .font(.body) } } } } } } } .padding() } } } struct Scripture1_Previews: PreviewProvider { static var previews: some View { Scripture1(welcome: Welcome.example) } }
无需转JSON的经文展示方案
你不需要提前把XML转成JSON文件,有两种更直接的方案可选:
- 用Swift原生的
XMLParser类直接解析XML格式的圣经资源,解析完成后直接映射到你定义的数据模型即可使用,省略格式转换的步骤。 - 可以选择第三方XML解析库简化解析逻辑,不需要自己实现XMLParser的代理方法。
如果你的圣经数据量较大,还可以把解析后的数据存入本地CoreData或者SQLite数据库,后续做章节查询、经文搜索、分页展示的效率会比每次解析整个JSON/XML文件高很多。
内容的提问来源于stack exchange,提问作者Lian
相关产品推荐
相关产品推荐

