You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:39:04