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

时间:2018-06-20 23:24:54

标签: ios swift swift4 decodable

初始化结构时出现错误,请参见下面的屏幕截图。调试后,我发现在结构中包含review变量会产生问题。 我不知道我在做什么错。 有人可以帮我吗?

Tx

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

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()
    }
}

enter image description here

4 个答案:

答案 0 :(得分:5)

评论没有默认值,您需要更改此值

var profileValue = ProfileValue()

var profileValue:ProfileValue?

OR

var review: ReviewValues?

OR

init结构中提供ProfileValue方法

答案 1 :(得分:3)

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

请注意,您所有的编码键枚举值都与属性名称匹配。如果名称相同,则无需包括编码键枚举。

答案 2 :(得分:0)

向您的ProfileValue结构添加一个初始化:

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()
  }
}

答案 3 :(得分:0)

添加默认的init方法,以可编码模式提供默认的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"
    }
}