Я пытаюсь создать приложение, которое получает объект JSON от конечной точки API, который затем я хочу перечислить в представлении. Я смотрел много видео на эту топику c, но в каждом видео они используют очень простые c JSON объекты в качестве примеров, и поэтому код, который они пишут, на самом деле, кажется, не передается, что дает мне ошибки как бы я ни пытался его отформатировать. Код выглядит следующим образом:
import SwiftUI
import Combine
import Foundation
public struct ActivityModel: Codable, Identifiable {
public let id: Int
public let name: String
public let activity_desc: String?
}
public struct ActivitiesModel2: Codable {
public let location: String
public let popular: [String:ActivityModel]
}
public struct ActivitiesModel: Codable {
public let activities: ActivitiesModel2
}
public class ActivityFetcher: ObservableObject {
var activities: ActivitiesModel?
init(){
guard let url = URL(string: "https://mywebsite.com/api/loadapi") else { return }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
do {
if let d = data {
let decodedLists = try JSONDecoder().decode(ActivitiesModel.self, from: d)
DispatchQueue.main.async {
self.activities = decodedLists
}
} else {
print("No Data")
}
} catch {
print("Error")
}
}.resume()
}
}
struct ActivityGuestView: View {
let networkingServiceGeneral = NetworkingServiceGeneral()
@ObservedObject var viewRouter: ViewRouter
@ObservedObject var fetcher = ActivityFetcher()
var body: some View {
// This is where my issues start
List(fetcher.activities?.activities.popular) { result in
VStack {
Text(result.name)
Text(result.activity_desc)
.font(.system(size: 11))
.foregroundColor(Color.gray)
}
}
}
}
Этот код, как я сказал, дает мне 5 ошибок. Они следующие:
- Initializer 'init(_:rowContent:)' requires that '(key: String, value: ActivityModel)' conform to Identifiable
- Initializer 'init(_:rowContent:)' requires that '[String : ActivityModel]' conform to 'RandomAccessCollection'
-Value of optional type '[String : ActivityModel]?' must be unwrapped to a value of type '[String : ActivityModel]'
- Coalesce using '??' to provide a default when the optional value contains 'nil'
- Force-unwrap using '!' to abort execution if the optional value contains 'nil'
Некоторые из этих ошибок имеют варианты, чтобы исправить это, но когда я нажимаю исправить, он добавляет код, но на самом деле не исправляет ошибку, поэтому я решил просто включить их в любом случае. Я все еще довольно новичок в Swift, но я знаю, о чем некоторые из них спрашивают, в частности, о соответствии с Identifiable, но он говорит, что struct ActivitiesModel не соответствует идентифицируемому при попытке добавить тег и объект JSON У меня нет идентификатора для этого раздела, поэтому я не могу попросить его сделать его идентифицируемым.
Любая помощь будет принята с благодарностью, сейчас это своего рода стена.
РЕДАКТИРОВАТЬ: Вот JSON
"activities": {
"location": "Dallas",
"popular": {
"10": {
"id": 38,
"name": "Adventure Landing Dallas",
"activity_desc": "Aquatic complex chain with additional land attractions including mini-golf, laser tag & go-karts.",
},
"12": {
"id": 40,
"name": "Jumpstreet",
"activity_desc": "None provided.",
},
}
}
}