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

如何调用类以重新执行其内部init()方法实现JSON数据重载

解决方案

Swift 中类的init初始化方法只能在实例创建阶段自动执行,无法对已经创建完成的实例主动调用init方法。你可以将JSON加载逻辑从init中抽离为独立的公开方法,兼顾初始化调用和后续手动刷新的需求:

import Foundation

struct Post:Codable,Identifiable {
    var userId:Int
    var id:Int
    var title:String
    var body:String
}

class DataSource {
    // 补全属性定义
    var allPosts: [Post] = []
    
    init() {
        // 初始化时自动执行一次加载
        reloadJSONData()
    }
    
    // 抽离独立加载方法,外部可主动调用刷新
    func reloadJSONData() {
        if let fileUrl = Bundle.main.url(forResource: "posts", withExtension: "json"),
           let fileData = try? Data(contentsOf: fileUrl) {
            self.allPosts = getPostsFromData(fileData)
            print("JSON数据已重新加载")
        }
    }
    
    // 你原有逻辑的解析方法实现示例
    private func getPostsFromData(_ data: Data) -> [Post] {
        do {
            return try JSONDecoder().decode([Post].self, from: data)
        } catch {
            print("JSON解析失败: \(error)")
            return []
        }
    }
}

使用方式

  • 初始化DataSource实例时会自动执行一次JSON加载
  • 需要刷新数据时,直接调用你持有的DataSource实例的reloadJSONData()方法即可:
// 示例:全局持有的DataSource实例调用刷新
yourDataSourceInstance.reloadJSONData()

如果你确实要通过重新执行init逻辑加载数据,只能销毁原有实例,重新创建新的DataSource实例:

// 废弃原有实例,新建实例会自动执行init里的加载逻辑
yourDataSourceInstance = DataSource()

额外提示:默认Bundle.main下的资源是项目编译时打包的固定副本,直接修改项目里的posts.json不会同步到已经运行的模拟器App中。如果需要运行时修改立即生效,可以把JSON存到沙盒Documents目录下读写,或者开启Xcode的资源热重载配置。

内容的提问来源于stack exchange,提问作者Christian Skjøth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:06:04