Swift中如何存储并使用默认对象列表
Swift中如何存储并使用默认对象列表
嘿,刚接触Swift的话别担心,我来一步步教你怎么处理这个默认对象列表的存储和使用~
1. 先定义对应的数据模型
首先得把JSON里的结构映射成Swift能识别的对象,用Codable协议最省心,不用自己写复杂的解析逻辑。咱们创建一个结构体:
struct ListItem: Codable { let name: String let icon: String }
这个结构体的属性和你JSON里的name、icon完全对应,Codable会自动帮我们处理JSON和对象之间的转换。
2. 解析默认的JSON数据
接下来有两种常见的方式来处理你的默认JSON:
方式一:直接把JSON写在代码里(适合小列表)
把你的JSON转成字符串,然后直接在代码里解析:
// 先把JSON转成字符串(注意转义双引号) let defaultItemsJSON = """ [ { "name": "Apple", "icon": "applelogo" }, { "name": "Banana", "icon": "leaf.fill" }, { "name": "Car", "icon": "car.fill" } ] """ // 解析成ListItem数组 func getDefaultItems() -> [ListItem]? { guard let jsonData = defaultItemsJSON.data(using: .utf8) else { return nil } do { let items = try JSONDecoder().decode([ListItem].self, from: jsonData) return items } catch { print("解析失败:\(error.localizedDescription)") return nil } }
调用这个方法就能拿到解析好的[ListItem]数组了,如果解析出错会打印错误信息,方便你排查问题。
方式二:把JSON存成文件(适合大列表或需要随时修改的情况)
如果你的默认列表以后可能要调整,把它做成.json文件更方便:
- 在Xcode里新建一个空文件,命名为
DefaultItems.json,把你的JSON内容粘贴进去 - 然后用下面的代码读取文件并解析:
func getDefaultItemsFromFile() -> [ListItem]? { guard let fileURL = Bundle.main.url(forResource: "DefaultItems", withExtension: "json") else { print("找不到JSON文件") return nil } do { let jsonData = try Data(contentsOf: fileURL) let items = try JSONDecoder().decode([ListItem].self, from: jsonData) return items } catch { print("读取或解析失败:\(error.localizedDescription)") return nil } }
3. 让默认列表全局复用(可选)
如果你的项目多个地方都要用到这个默认列表,不想每次都解析一遍,可以搞个简单的管理类,用单例或者静态属性来缓存解析后的结果:
class DefaultDataManager { static let shared = DefaultDataManager() var defaultItems: [ListItem]? private init() { // 初始化的时候就解析好,后面直接用 defaultItems = getDefaultItems() // 如果用文件的话就换成getDefaultItemsFromFile() } }
之后在项目任何地方想用,直接这样拿:
if let items = DefaultDataManager.shared.defaultItems { // 这里就可以用items数组了 print(items.map { $0.name }) }
4. 在下拉菜单里使用(举个SwiftUI的例子)
如果是用SwiftUI做下拉选择器,直接把数组传给Picker就行:
struct ContentView: View { @State private var selectedItem: ListItem? let defaultItems = DefaultDataManager.shared.defaultItems ?? [] var body: some View { Picker("选择一项", selection: $selectedItem) { ForEach(defaultItems, id: \.name) { item in HStack { Image(systemName: item.icon) Text(item.name) } } } .pickerStyle(.menu) } }
如果是UIKit的UIPickerView,只需要把数组作为数据源,实现UIPickerViewDataSource和UIPickerViewDelegate的方法就行,逻辑差不多。
备注:内容来源于stack exchange,提问作者user16971617
相关产品推荐
相关产品推荐

