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

在Swift中使用Disk修改JSON文件intensity值的技术求助

解决方案

要修改JSON文件中对应track的intensity值,你需要完成内存数据修改和文件持久化写入两个核心步骤,结合你使用的Disk库和SwiftUI场景,具体操作如下:

1. 调整Track结构体与视图绑定

首先确保Track结构体支持序列化/反序列化,同时让TrackRow能修改源数据:

// 让Track遵循Codable(用于JSON解析)和Identifiable(方便List遍历)
struct Track: Codable, Identifiable {
    let id: Int
    var trackName: String
    var intensity: Int
    var album: String
}

// 修改TrackRow,将track改为@Binding类型,实现双向数据传递
struct TrackRow: View {
    @Binding var track: Track
    
    var body: some View {
        HStack {
            Image(track.album)
                .resizable()
                .frame(width: 50, height: 50)
            VStack(alignment: .leading) {
                Text(track.trackName)
                Text(track.album)
                    .foregroundColor(Color.gray)
            }
            Spacer()
            Text(String(track.intensity))
                .padding(.trailing)
                .onTapGesture {
                    // 1. 修改内存中的intensity值(这里示例加1,可替换为你需要的整数)
                    track.intensity += 1
                    // 2. 调用保存方法,将修改后的数据写入JSON文件
                    saveUpdatedTracks()
                }
        }
    }
    
    // 保存修改后的完整数组到JSON文件
    private func saveUpdatedTracks() {
        // 这里需要获取当前所有track的最新状态,建议从父视图传递完整数组的Binding
        // 示例假设你已持有全局/父视图传递的tracks数组
        guard let parentTracks = (UIApplication.shared.windows.first?.rootViewController as? UIHostingController<ContentView>)?.rootView.tracks else {
            print("无法获取tracks数据源")
            return
        }
        
        do {
            // 写入沙盒Documents目录下的tracks.json文件
            try Disk.save(parentTracks, to: .documents, as: "tracks.json")
        } catch {
            print("保存失败:\(error.localizedDescription)")
        }
    }
}

2. 父视图中管理数据源的读取与传递

在主视图中完成JSON文件的初始读取,并将可变的tracks数组传递给TrackRow:

struct ContentView: View {
    // 用@State维护可变的tracks数组
    @State private var tracks: [Track] = []
    
    var body: some View {
        List {
            // 使用$符号传递Binding,让TrackRow能修改源数据
            ForEach($tracks) { $track in
                TrackRow(track: $track)
            }
        }
        .onAppear {
            // 视图加载时读取JSON文件
            loadTracksFromDisk()
        }
    }
    
    // 从Disk读取JSON文件到内存
    private func loadTracksFromDisk() {
        do {
            tracks = try Disk.load([Track].self, from: .documents, as: "tracks.json")
        } catch {
            // 如果文件不存在,初始化示例数据并写入
            tracks = [
                Track(id: 1001, trackName: "Rain of Amethyst", intensity: 0, album: "crystallized"),
                Track(id: 1002, trackName: "Artificial Snow", intensity: 0, album: "crystallized")
            ]
            try? Disk.save(tracks, to: .documents, as: "tracks.json")
        }
    }
}

3. 关键注意事项

  • 路径一致性:读取和写入必须使用同一个文件路径,Disk的.documents是应用沙盒的Documents目录,适合存储用户可修改数据。
  • Codable匹配:Track的属性名必须和JSON中的键完全一致(比如trackName不能写成trackname),否则会解析失败。
  • 错误处理:示例简化了错误处理,实际开发中建议添加用户提示(比如弹窗告知保存失败)。

内容的提问来源于stack exchange,提问作者Luke Nelson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:13:27