如何调用类以重新执行其内部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
相关产品推荐
相关产品推荐

