iOS Swift 可解码:错误:无法为没有参数的类型调用初始化程序

Posted

技术标签:

【中文标题】iOS Swift 可解码:错误:无法为没有参数的类型调用初始化程序【英文标题】:iOS Swift Decodable: Error: Cannot invoke initializer for type with no arguments 【发布时间】:2018-11-30 04:29:21 【问题描述】:

我在初始化结构时遇到错误,请参阅下面的屏幕截图。调试后,我发现在结构中包含审查变量会出现问题。 我无法弄清楚我做错了什么。 谁能帮帮我?

发送

我正在复制代码以防万一您需要尝试一下

import UIKit

struct RootValue : Decodable 
    private enum CodingKeys : String, CodingKey 
        case success = "success"
        case content = "data"
        case errors = "errors"
    
    let success: Bool
    let content : [ProfileValue]
    let errors: [String]


struct ProfileValue : Decodable 
    private enum CodingKeys : String, CodingKey 
        case id = "id"
        case name = "name"
        case review = "review" // including this gives error
    

    var id: Int = 0
    var name: String = ""
    var review: ReviewValues // including this gives error


struct ReviewValues : Decodable
    private enum CodingKeys : String, CodingKey 
        case place = "place"
    

    var place: String = ""


class ViewController: UIViewController 

    var profileValue = ProfileValue()

    override func viewDidLoad() 
        super.viewDidLoad()
    

【问题讨论】:

我将您的代码扔到 Playground 中,并被要求使用 var profileValue = ProfileValue(id: 0, name: "", review: ReviewValues(place: ""))。要克服它,您必须提供自定义 init 函数,但 review 不是可选的,因此您必须为其提供一个值 【参考方案1】:

您的ProfileValue 结构没有review 属性的默认值。这就是编译器不满意的原因,因为您试图创建 ProfileValue 的实例而不为所有非可选属性提供默认值。

附带说明,您的所有编码键枚举值都与属性名称匹配。如果名称相同,则无需包含编码键枚举。

【讨论】:

【参考方案2】:

评论没有默认值,你需要改变这个

var profileValue = ProfileValue()

var profileValue:ProfileValue?

var review: ReviewValues?

ProfileValue结构中提供init方法

【讨论】:

谢谢 我试过这个 var review:ReviewValues?它正在工作。【参考方案3】:

在 ProfileValue 结构中添加一个 init:

struct ProfileValue : Decodable 
  private enum CodingKeys : String, CodingKey 
    case id = "id"
    case name = "name"
    case review = "review" // including this gives error
  

  var id: Int = 0
  var name: String = ""
  var review: ReviewValues // including this gives error

  init() 
    self.review = ReviewValues()
  

【讨论】:

【参考方案4】:

添加默认的init方法,在可编码的modal中提供默认的init方法来创建编码对象。

struct Modal: Codable 

    var status: String?
    var result : [Result?]?

    // To provide the default init method to create the encoded object

    init?() 
        return nil
    

    private enum CodingKeys: String, CodingKey 
        case status = "status"
        case result = "result"
    

【讨论】:

以上是关于iOS Swift 可解码:错误:无法为没有参数的类型调用初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

无法在iOS swift中将base64string解码为uiimage,但在android中工作正常[重复]

无法为没有参数的“URL”类型调用初始化程序 - Swift 3

Swift 4 可解码 - 附加变量

带有可配置键的 Swift 4 JSON 解码

如何在 Swift 4 中引用通用的可解码结构

如何在 Swift 4 中为 JSON 编写可解码,其中键是动态的?