【发布时间】:2022-01-08 05:45:27
【问题描述】:
我需要访问 Memodel 结构的嵌套字典中的数据。来自音乐和图像词典。请需要任何帮助才能正确绘制,我尝试使用 AzampSharp 的示例https://www.youtube.com/watch?v=b5wVIQNrI6k,但我相信我做错了什么。谢谢。
import SwiftUI
struct MemodelAPIResult: Codable {
let data: [Memodel]
enum CodingKeys: String, CodingKey {
case data = "results"
}
}
struct Memodel: Identifiable, Codable {
var id: String
var followers: String
var following: String
let music: [MemodelMusic]
let images: [MemodelImages]
}
struct MemodelMusic: Identifiable, Codable, Hashable {
var id: String
var musicfile: URL
var musicname: String
var musicartistname: String
var musicgenre: String
}
struct MemodelImages: Identifiable, Codable, Hashable {
var id: String
var albumimages: URL
var abumlikes: String
var albumviews: String
}
下面是我的视图模型中的 ObservableObject
import Foundation
import SwiftUI
import Combine
import CryptoKit
class MeViewmodel: ObservableObject {
@Published var me: [Memodel]? = nil
init() {
self.fetchme()
}
func fetchme() {
let url = ""
let session = URLSession(configuration: .default)
session.dataTask(with: URL(string: url)!) { (data, _, err) in
if let error = err{
print(error.localizedDescription)
return
}
guard let APIData = data else {
print("No Data found")
return
}
do {
let new = try JSONDecoder().decode(MemodelAPIResult.self, from: APIData)
DispatchQueue.main.async {
self.me = new.data
}
}
catch{
print(error)
}
}
.resume()
}
}
然后是项目视图
struct MeMusicItemView: View {
//E-MARK: - Properties
var me: Memodel
//E-MARK: - Body
var body: some View {
HStack {
VStack(alignment: .leading, spacing: 5) {
Text(me.music[0].musicname)
.font(.callout)
.fontWeight(.medium)
.foregroundColor(.white)
Text(me.music[0].musicartistname)
.font(.caption2)
.fontWeight(.light)
.foregroundColor(.white)
Text(me.music[0].musicgenre)
.font(.system(size: 8))
.fontWeight(.light)
.foregroundColor(.gray)
}
}
}
}
还有父视图中的 ForEach....
if let meMusicData = meMusicData.mememe {
ForEach(meMusicData) { music in
MeMusicItemView(memusic: music)
}
} else {
ProgressView()
.padding(.top, 20)
}
【问题讨论】:
-
究竟是什么不起作用?你得到什么错误?你可以试试
var musicfile: String和var albumimages: String -
@workingdog 当我尝试通过“var me: Memodel”访问结构中的 Memodel 字典时,我可以访问例如“me.followers”,但无法访问嵌套字典!例如“me.music.musicfile”
-
me.music是一个数组。您可以使用索引访问数组,如下所示:me.music[0].musicfile. -
@workingdog 是的,它有效,谢谢。但是还有另一个问题,该数组有超过 10 个条目,在使用 me.music[].musicfile 的输入视图中需要您返回一个整数,我想返回所有条目,因为我使用的是 forEach in主视图。
-
我在您的代码中看不到任何“输入视图”或
ForEach。您将不得不显示更多代码,并解释您的问题是什么。我建议您阅读 Apple 的 SwiftUI 教程developer.apple.com/tutorials/swiftui。
标签: swiftui model mapping viewmodel nested-json