Swift 4: структура в структуре - PullRequest
0 голосов
/ 25 июня 2018

У меня проблема с созданием структуры.

Моя структура:

public struct Device: Codable {
    let data: DeviceData
    let meta: Meta?
}

public struct DeviceData: Codable {
    let deviceID: String?
    let type: String?
    let attributes: Attributes?

    private enum CodingKeys: String, CodingKey {
        case deviceID = "id"
        case type
        case attributes
    }
}

public struct Attributes: Codable {
    let name: String?
    let asdf: String?
    let payload: Payload?
}

public struct Payload: Codable {
    let example: String?
}

public struct Meta: Codable {
    let currentPage: Int?
    let nextPage: Int?
    let deviceID: [String]?
}

Когда я сейчас хочу создать элемент этой структуры с помощью:

var exampleData = Device(
        data: DeviceData(
            type: "messages",
            attributes: Attributes(
                name: "Hello World",
                asdf: "This is my message",
                payload: Payload(
                    example: "World"
                )
            )
        ),
        meta: Meta(
            deviceID: ["asfd-asdf-asdf-asdf-asdfcasdf"]
        )
    )

Я получу ошибку.Невозможно подробно указать эту ошибку, потому что, когда я удаляю элемент «meta», поскольку он необязательный, возникает другая ошибка ... Сообщение об ошибке для этого конкретного кода:

Дополнительный аргумент 'meta'в вызове

Я надеюсь, что кто-то может мне помочь.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы пропустили аргументы для ваших DeviceData и Meta инициализаторов. В комментарии к другому ответу вы спрашиваете:

Должен ли я добавить их и установить их на ноль, даже если они не обязательны? может быть это моя проблема!

Вы можете сделать это, например, что-то вроде:

meta: Meta(currentPage: nil,
           nextPage: nil,
           deviceID: ["asfd-asdf-asdf-asdf-asdfcasdf"]
          )

В качестве альтернативы вы можете написать свой собственный инициализатор вместо того, чтобы полагаться на элемент по умолчанию для каждого элемента, и указывать значения по умолчанию вместо каждого вызова, например. что-то вроде:

init(currentPage : Int? = nil, nextPage : Int? = nil, deviceID : [String]? = nil)
{
   self.currentPage = currentPage
   self.nextPage = nextPage
   self.deviceID = deviceID
}

Ваш исходный вызов, в котором пропущены currentPage и nextPage, будет действительным и установит для этих двух значение nil.

НТН

0 голосов
/ 25 июня 2018

Вы забыли deviceID: именованные аргументы вашего вызова DeviceData.init(deviceID:type:attributes:), и вы также забыли currentPage и nextPage именованные аргументы Meta.init(currentPage:nextPage:deviceID).

Вот пример, который компилируется:

var exampleData = Device(
    data: DeviceData(
        deviceID: "someID",
        type: "messages",
        attributes: Attributes(
            name: "Hello World",
            asdf: "This is my message",
            payload: Payload(
                example: "World"
            )
        )
    ),
    meta: Meta(
        currentPage: 123,
        nextPage: 456,
        deviceID: ["asfd-asdf-asdf-asdf-asdfcasdf"]
    )
)
...