В настоящее время я пишу свое первое более крупное приложение iOS, которое я надеюсь выпустить в ближайшем будущем. Проблема, которую я не могу решить самостоятельно, заключается в следующем:
Учитывая мой веб-сервис WebServicePins.swift
Я получаю данные из своего собственного API. Это выглядит так:
[
{
"id": 1,
"title": "Berlin",
"body": "Capital of Germany",
"thumb": "*Link to my AWS bucket*",
"lng_coord": "13.404954",
"lat_coord": "52.520008",
"date": "2019-11-10T11:36:31.409361Z",
"owner": 1,
"type": "other"
},
{
"id": 4,
"title": "Munich",
"body": "Home of the Oktoberfest",
"thumb": "*Link to my AWS bucket*",
"lng_coord": "11.576124",
"lat_coord": "48.137154",
"date": "2019-11-10T11:36:31.409361Z",
"owner": 1,
"type": "other"
}
]
и так далее. Веб-служба работает нормально, и я использую данные в PinListViewModel.swift
:
import Foundation
class PinListViewModel: ObservableObject {
@Published var pins = [PinViewModel]()
init() {
WebservicePins().getPins { pins in
if let pins = pins {
self.pins = pins.map(PinViewModel.init)
}
}
}
}
struct PinViewModel: Identifiable {
var pin: Pin
init(pin: Pin) {
self.pin = pin
}
var id: Int {
return self.pin.id
}
var title: String {
return self.pin.title
}
var body: String {
return self.pin.body
}
var thumb: String {
return self.pin.thumb
}
var lng_coord: String {
return self.pin.lng_coord
}
var lat_coord: String {
return self.pin.lat_coord
}
var date: String {
return self.pin.date
}
var owner: Int {
return self.pin.owner
}
var type: String {
return self.pin.type
}
}
. Использование ObservableObject для отображения списка в представлении SwiftUI -
struct ArticlesTabView: View {
@ObservedObject private var pinListVM = PinListViewModel()
var body: some View {
VStack {
List(self.pinListVM.articles, id: \.id) { pin in
Text(pin.title)
}
}
}
}
работает как положено однако я не могу l oop по массиву, как, например, в
func makeUIView(context: Context) -> MKMapView {
let pinListVM = PinListViewModel()
let mapView = MKMapView()
mapView.delegate = context.coordinator
// Test Annotations
let testPins = [
Pin(id: 1, title: "Berlin", body: "Capital of Germany",
thumb: "", lng_coord: "13.404954", lat_coord: "52.520008", date: "",
owner: 1, type: "action"),
Pin(id: 2, title: "München", body: "Home of the Oktoberfest",
thumb: "", lng_coord: "11.576124", lat_coord: "48.137154", date: "",
owner: 1, type: "other")
]
for pin in pinListVM.pins {
let annotation = MKPointAnnotation()
annotation.title = pin.title
annotation.subtitle = pin.body
annotation.coordinate = CLLocationCoordinate2D(latitude: Double(pin.lat_coord)!, longitude: Double(pin.lng_coord)!)
mapView.addAnnotation(annotation)
}
for testPin in testPins {
let annotation = MKPointAnnotation()
annotation.title = testPin.title
annotation.subtitle = testPin.body
annotation.coordinate = CLLocationCoordinate2D(latitude: Double(testPin.lat_coord)!, longitude: Double(testPin.lng_coord)!)
// annotation.pinTintColor = UIColor.green
mapView.addAnnotation(annotation)
}
return mapView
}
Отображаются testPins
, а pins
не отображаются на окончательной карте. Можете ли вы помочь мне найти мою ошибку? Заранее спасибо! PS: я новичок в stackoverflow.com, не стесняйтесь менять мой вопрос / скажите, как сделать его более наглядным или понятным!