我正在嘗試從 JSON 獲取資料。到目前為止,我可以提取并列印它。
我現在的目標是能夠在我的 ContentView 中使用它,以便可以在 Text View 或類似的東西中使用它。我嘗試創建@State 變數,將其作為引數傳遞等等,但似乎沒有任何效果。
我對 SwiftUI 還很陌生,所以非常感謝您的幫助!
struct GeoService: Codable {
var status: String
var results: [GeoResult]
}
struct GeoResult: Codable {
struct Geometry: Codable {
struct Location: Codable {
let lat: Float
let lng: Float
init() {
lat = 32
lng = 30
}
}
let location: Location
}
let formatted_address: String
let geometry: Geometry
}
struct ContentView: View {
// @State private var results: Any ?????????
var body: some View {
NavigationView {
Text("Test")
.navigationTitle("Quotes")
.task {
await handleData()
}
}
}
func handleData() async {
let geoResult="""
{
"results": [
{
"formatted_address": "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
"geometry": {
"location": {
"lat": 37.4224764,
"lng": -122.0842499
}
}
},
{
"formatted_address": "Test addresss",
"geometry": {
"location": {
"lat": 120.32132145,
"lng": -43.90235469
}
}
}
],
"status": "OK"
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
print("executing handleData()")
do {
let obj = try decoder.decode(GeoService.self, from: geoResult)
for result in obj.results {
print("Address: \(result.formatted_address)")
print("Lat/long: (\(result.geometry.location.lat), \(result.geometry.location.lng))")
}
} catch {
print("Did not work :(")
}
}
}
uj5u.com熱心網友回復:
我將獲取請求移至其自己的類,以便我們可以利用ObservableObject資料Publish。發布資料允許訂閱視圖在發布的資料更改時更新資料。在這種情況下,您ContentView正在通過代碼行訂閱資料@ObservedObject var geoData: ResponseData。
此外,我添加了如何訪問視圖中的兩條相關資料,并將其顯示在串列中以便于閱讀。這應該讓您了解如何訪問/顯示資料。
希望這為您提供了足夠的資訊來調整答案以使其按您希望的方式作業。
import SwiftUI
struct GeoService: Codable {
var status: String?
var results: [GeoResult]?
}
struct GeoResult: Codable {
struct Geometry: Codable {
struct Location: Codable {
let lat: Float
let lng: Float
init() {
lat = 32
lng = 30
}
}
let location: Location
}
let formatted_address: String
let geometry: Geometry
}
struct ContentView: View {
@ObservedObject var geoData: ResponseData
var body: some View {
NavigationView {
if #available(iOS 15.0, *) {
List {
Text(geoData.geoResultsData?.results?[0].formatted_address ?? "Loading")
Text(String(geoData.geoResultsData?.results?[0].geometry.location.lat ?? 0))
}
.navigationTitle("Quotes")
.task {
await geoData.handleData()
print(geoData.geoResultsData, "yessssss")
}
} else {
Text("failure")
}
}
}
}
class ResponseData: ObservableObject {
@Published var geoResultsData: GeoService?
func handleData() async {
let geoResult="""
{
"results": [
{
"formatted_address": "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
"geometry": {
"location": {
"lat": 37.4224764,
"lng": -122.0842499
}
}
},
{
"formatted_address": "Test addresss",
"geometry": {
"location": {
"lat": 120.32132145,
"lng": -43.90235469
}
}
}
],
"status": "OK"
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
print("executing handleData()")
do {
let obj = try decoder.decode(GeoService.self, from: geoResult)
geoResultsData = obj
} catch {
print("Did not work :(")
}
}
}
編輯:
您將需要在您的應用程式中初始化一些資料。如果需要,您可以暫時將其初始化為空。這可以通過執行以下操作來完成:ContentView(geoData: ResponseData.init())
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/478513.html
上一篇:在向我的結構添加屬性后獲取執行緒10:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
下一篇:當collectionView位于UITableView行內時,collectionView中的didSelectItemAt不會被呼叫
