You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("---&gt; 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:12:04