【迅捷UI】如何初始化空结构



我需要一些 SwiftUI 的帮助。

我下面有一个模型,可以接收 JSON 数据。 当我想将其初始化为空数组时,它应该很简单,只需说明答案,但是我如何将其初始化为一个数组而不是一个空的单个数据集。

struct Answers: Identifiable, Decodable  {
let id: Int
let questionsUsersId: Int
let reactions: [Reactions]
enum CodingKeys: String, CodingKey {
case id = "questions_id"
case questionsUsersId = "questions_users_id"
case reactions = "reactions"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.id = try container.decodeIfPresent(Int.self, forKey: .id) ?? 0
self.questionsUsersId = try container.decodeIfPresent(Int.self, forKey: .questionsUsersId) ?? 0
self.reactions = try container.decodeIfPresent([Reactions].self, forKey: .reactions) ?? [Reactions]()
}

}

我尝试过var答案:答案=答案( ),但出现以下错误:

//Missing argument for parameter 'from' in call
//Insert 'from: <#Decoder#>'

我想将其初始化为空的原因是,当数据模型为 nil 时,我需要交出它的默认值。(即我应该在 xxx 中写什么?

@ObservedObject var receiveAnswersViewModel = ReceiveAnswersViewModel()
//abbreviate
NavigationLink(destination: AnswerDetailView(answer: receiveAnswersViewModel.answer ?? xxx), isActive: $shouldNavigate) {

ForEach(myPageViewModel.answers(forFilter: selectedFilter)?.answers ?? [Answers]()) { answer in

AnswerCell(answer: answer)
.gesture(TapGesture()
.onEnded({ _ in
//your action here
self.answersId = answer.answersId
receiveAnswersViewModel.fetchAnswers(answers_id: answersId ?? 0)
}))
}
}

这就是我在上面尝试做的事情:使用导航链接显示多个单元格。(想象一下,这些单元格是推文。在视图模型中按列表中的一条推文→调用 fetchAnswers 功能,该函数将按下的推文 ID 作为参数 → 返回特定的推文详细信息→将其放入答案模型中→将其移交给视图→导航到推文详细信息视图。

查看型号代码如下:

class ReceiveAnswersViewModel: ObservableObject {
@Published var answer: Answers?
func fetchAnswers(answers_id: Int){
//abbreviate
self.answer = try JSONDecoder().decode(Answers.self, from: data)
}

提前谢谢。

一个合理的方法是添加一个静态方法来创建一个空实例。在这种情况下,您还必须添加init方法

顺便说一下,以单数形式命名结构,一个实例表示可能的一个Answer

struct Answer: Identifiable, Decodable  {
let id: Int
let questionsUsersId: Int
let reactions: [Reactions]
static let example = Answer(id: 0, questionsUsersId: 0, reactions: [])
init(id: Int, questionsUsersId: Int, reactions: [Reactions]) {
self.id = id
self.questionsUsersId = questionsUsersId
self.reactions = reactions
}
...

然后你可以声明

var answer = Answer.example 

最新更新