是的,你的 SPORT
枚举定义基本上是正确的,使用了原始值类型 Int32
和 CaseIterable
协议,能够很方便地处理与 JSON 文件相关的数据加载。下面是一些可能需要注意的细节和最佳实践:
完整示例
// MARK: Define the SPORT enum
enum SPORT: Int32, CaseIterable {
case SKIP_ROPE = 8
case SIT_UP = 2
var jsonFilePath: String? {
switch self {
case .SKIP_ROPE:
return Bundle.main.path(forResource: "skip_rope", ofType: "json")
case .SIT_UP:
return Bundle.main.path(forResource: "sit_up", ofType: "json")
}
}
func loadData<T: Codable>() -> T? {
guard let path = jsonFilePath else { return nil }
do {
let data = try Data(contentsOf: URL(fileURLWithPath: path))
let decodedData = try JSONDecoder().decode(T.self, from: data)
return decodedData
} catch {
print("Error loading data for \(self.rawValue): \(error)")
return nil
}
}
}
使用说明
泛型支持:在
loadData()
方法中,我使用了泛型<T: Codable>
,这使得该方法可以返回不同类型的数据。这样你就可以根据传入的数据模型来解码,而不必为每种运动单独编写一个加载方法。错误处理:在你的实现中,使用
do-catch
来捕捉并打印任何潜在的错误,这是一种良好的实践。JSON文件路径:确保你的 JSON 文件(如
skip_rope.json
和sit_up.json
)已经添加到你的项目中,并且这些文件确实存在于主包中。
调用示例
如果你有相应的模型类,比如:
struct SkipRopeData: Codable {
// 定义你的属性
}
struct SitUpData: Codable {
// 定义你的属性
}
你可以通过枚举实例来加载数据,如下所示:
if let skipRopeInfo: SkipRopeData = SPORT.SKIP_ROPE.loadData() {
print("Loaded skip rope data:", skipRopeInfo)
}
if let sitUpInfo: SitUpData = SPORT.SIT_UP.loadData() {
print("Loaded sit up data:", sitUpInfo)
}
这段代码会尝试从对应的 JSON 文件中加载数据并解析成相应的结构体。整体逻辑看起来很好,如果有其他问题或需要更深入的信息,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问