【SwiftUI】如何初始化一个空的struct

Posted

技术标签:

【中文标题】【SwiftUI】如何初始化一个空的struct【英文标题】:【SwiftUI】How to initialize an empty struct 【发布时间】:2022-01-13 23:12:27 【问题描述】:

我需要 SwiftUI 方面的帮助。

我在下面有一个模型,它接收 JSON 数据。 当我想将其初始化为一个空数组时,应该很简单,只是说明Answers,但是我怎样才能将它初始化为一个空数组而不是一个空的单个数据集。

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 answer: Answers = Answers( ) 但得到以下错误:

//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)
                                       ))
                         
                    

这就是我在上面尝试做的事情:使用 NavigationLink 显示多个单元格。 (假设单元格是推文。)按下列表中的一条推文→在视图模型中调用 fetchAnswers 函数,该模型将按下的推文 id 作为参数→返回特定的推文详细信息→将其放入答案模型中→手转到视图 → 导航到推文详细信息视图。

查看模型代码如下:

class ReceiveAnswersViewModel: ObservableObject 
@Published var answer: Answers?

func fetchAnswers(answers_id: Int)
//abbreviate
self.answer = try JSONDecoder().decode(Answers.self, from: data)

提前致谢。

【问题讨论】:

对不起,我的意思是写“当我想将它初始化为一个空数组时,应该很简单,只是在开头写[Answers]()”。 【参考方案1】:

一个合理的方法是添加一个静态方法来创建一个空实例。在这种情况下,您还必须添加 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 

【讨论】:

瓦迪安,非常感谢。我在结构中添加了静态 let 示例,但出现以下三个错误。你能帮帮我吗? 1. 调用中位置#1、#2、#3 的额外参数 2. 调用中参数'from' 缺少参数 3. 插入'from: , ' 您必须添加标准的init 方法。查看编辑。 瓦迪安,谢谢。在那种情况下,我是否必须删除当前的初始化(来自解码器:解码器)?我需要解码 JSON 数据并将其放入 Answers 模型中,因此我不想删除它。目前我正在按照以下方式进行操作。 “self.answer = 尝试 JSONDecoder().decode(Answers.self, from: data)”。如果我使用标准初始化,我将无法将 JSON 数据解析为 Answers 模型。 (顺便说一句,我还将这个 Answers 模型初始化为不同函数中的数组,因此我将其命名为 Answers,尽管在这个问题中我将其初始化为单个数据集。) 你需要两个init 方法,所以保留init(from decoder。如果您有一个数组,那么数组中的第一项是 answer 而不是 answers。复数形式令人困惑。查看标准库:字符串数组是[String] 而不是[Strings] 瓦迪安,成功了!非常感谢。你拯救了我的一周:)

以上是关于【SwiftUI】如何初始化一个空的struct的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI @State var 初始化问题

结构中的 Swift/SwiftUI 属性初始化程序错误

C语言初阶《三子棋》

SwiftUI初感悟与感想

SwiftUI初感悟与感想

SwiftUI初感悟与感想