
数据是任何应用程序的核心。如果您不从 Contentful 等第三方服务加载数据,则可以依赖 JSON 文件中的本地数据。让我们学习如何将 JSON 数据加载和解析到我们的 SwiftUI 应用程序中。
JSON,也称为 JavaScript Object Notation,是一种轻量级的数据格式。它适用于键值对,并且只接受某些类型的值:对象、数组、字符串、数字、布尔值、空值。下面是 JSON 的一个简单示例
{"name": "John","age": 30,"car": null}
接下来创建我们的数字模型,例如我们来创建一个 Animal 模型,每个模型都包含 id ,name,age 和 type 属性。**
// Animal.swiftstruct Animal: Identifiable, Decodable {var id: Intvar name: Stringvar age: Intvar type: String}
基于刚才的 Animal 模型我们来创建 JSON 相关的数据,这里需要注意的是 JSON 数据的数据项的属性需要和 model 类型的属性一一对应。
// animalData.json[{"id": 1001,"name": "Toto","age": 3,"type": "Dog"},{"id": 1002,"name": "Betsy","age": 7,"type": "Cat"},{"id": 1003,"name": "Olive","age": 36,"type": "Tortoise"},{"id": 1004,"name": "Jupiter","age": 10,"type": "Parrot"},{"id": 1005,"name": "Ulysse","age": 17,"type": "Monkey"}]
注意:为了防止程序报错,小编强烈建议用 JSON 工具进行验证其数据格式的正确性。
继续我们来创建 ModelData 文件,来解析我们的 JSON 数据文件,示例代码如下
// ModelData.swiftvar animals: [Animal] = load("animalData.json")func load<T: Decodable>(_ filename: String) -> T {let data: Dataguard let file = Bundle.main.url(forResource: filename, withExtension: nil)else {fatalError("Couldn't find \(filename) in main bundle.")}do {data = try Data(contentsOf: file)} catch {fatalError("Couldn't load \(filename) from main bundle:\n\(error)")}do {let decoder = JSONDecoder()return try decoder.decode(T.self, from: data)} catch {fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")}}
上面的 load() 函数从作为参数传递的文件路径中获取文件,并将 JSON 数据解码为 Swift 可以读取的格式。如果有错误,错误将打印在控制台中。
加载功能完成后,您的数据将可用并准备好使用,定义 animals 数组类型为 Animal 类型的数组,因为 load() 函数需要知道它应该输出什么类型的数据,如果成功返回将保存在 animals 中。
最后我们需要在界面中渲染 animals 变量中的数据,我们可以使用 ForEach 循环来展示数据,示例代码如下
var body: some View {VStack {ForEach(animals) { animal inText("\(animal.name) is a \(animal.type) and is \(animal.age) years old.")}}}
注:本文属于原创文章,版权属于「前端达人」公众号及 SwiftUI.cc 所有,谢绝一切形式的转载
更多精彩内容,请关注「前端达人」
其他技术
公众号:前端达人
