web-dev-qa-db-ja.com

iOS Swift Decodable:Error:引数なしで型の初期化子を呼び出すことはできません

構造体の初期化でエラーが発生します。以下のスクリーンショットを参照してください。デバッグ後、構造体にレビュー変数を含めると問題が発生することがわかりました。何が間違っているのかわかりません。誰も私を助けることができますか?

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

6
Matt

レビューにはデフォルト値がありません。これを変更する必要があります

var profileValue = ProfileValue()

var profileValue:ProfileValue?

[〜#〜] or [〜#〜]

var review: ReviewValues?

[〜#〜] or [〜#〜]

init構造体にProfileValueメソッドを指定します

8
Sh_Khan

ProfileValue構造体には、reviewプロパティのデフォルト値がありません。これが、オプションではないすべてのプロパティにデフォルト値を提供せずにProfileValueのインスタンスを作成しようとしているため、コンパイラが不満を抱いている理由です。

補足として、すべてのコーディングキー列挙値はプロパティ名と一致します。名前が同じ場合は、コーディングキーの列挙を含める必要はありません。

3

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()
  }
}
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"
    }
}
0
Nirbhay Singh