Swift展示Ticketmaster API解码JSON结果时遇类型转换错误求助
解决SwiftUI List错误:无法将[EventImport.Event]转换为Range
错误原因
编译器错误地把List(events)解析为接受Range<Int>的初始化器,而非适配Identifiable元素数组的版本。核心问题是编译器无法正确推断数据源类型,或是存在隐式的类型/命名冲突。
解决步骤
显式引导编译器匹配正确初始化器
将List(events)修改为List(Array(events)),强制编译器调用接受集合类型的初始化器:List(Array(events)) { event in // 原有HStack内容 }确认
Event的Identifiable实现(可选)
你的Event结构体已经正确遵循Identifiable协议并拥有id属性,这部分没问题。如果存在外部类型命名冲突,可显式指定类型消除歧义:@State var events: [EventImport.Event] = []修复JSON解码的日期解析问题(潜在坑)
当前Public结构体里的startDateTime和endDateTime用Date类型,但JSONDecoder默认无法解析API返回的日期字符串。需给解码器设置日期解码策略:let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 let decoded = try decoder.decode(Welcome.self, from: data)
修改后的关键代码片段
struct EventImport : View{ @State var events: [Event] = [] var body: some View { // 显式转换数组类型,引导编译器匹配正确初始化器 List(Array(events)) { event in HStack{ let dealLink1 = event.url Text("\(event.name)") Button() { openLink1(linking: dealLink1) }label: { Image(systemName: "link.circle") } .tint(.teal) .bold() } } .task { do { if let results = try await fetchTMEvents() { events = results } } catch { print("---> error: \(error)") } } } func fetchTMEvents() async throws -> [Event]? { let apiKey = "XXXXXXXXX" let tmStart = Date() let tmEnd = Date()+(3600*24) let tmCity = 303 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" let formattedStart: String = dateFormatter.string(from: tmStart) let formattedEnd: String = dateFormatter.string(from: tmEnd) let urlTM = URL(string: "https://app.ticketmaster.com/discovery/v2/events.json?dmaId=303&apikey=\(apiKey)&dmaId=\(tmCity)&startDateTime=\(formattedStart)&endDateTime=\(formattedEnd)")! let(data, _) = try await URLSession.shared.data(from: urlTM) print("API") print(String(data: data, encoding: .utf8) as Any) // 添加日期解码策略 let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 let decoded = try decoder.decode(Welcome.self, from: data) return decoded.embedded.events } // 原有其他代码保持不变... }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

