Китура дает мне неоднозначный тип выражения во вложенных структурах

Я начинаю использовать инфраструктуру Kitura для переноса моего текущего бэкэнда node.js на swift, и я начинаю с реализации всех маршрутов с фиктивными данными.

В любом случае, сейчас я на очень ранней стадии и начал разрабатывать некоторые фиктивные конечные точки и без проблем развертывать их в IBM Cloud, они работают отлично. Одним из примеров рабочей конечной точки является следующее:

app.router.post("/getStats") { (request, response, next) in
    let mocks = Mocks()
    response.send(json: mocks.dashboard)
    next()
}

Mocks() — это класс, который содержит структуру dashboard со всеми предопределенными полями. Эти поля представляют собой простые типы (строки и числа).

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

app.router.post("/generateTest") { (request, response, next) in
    let mocks = Mocks()
    response.send(json: mocks.getTest())
    next()
}

Вместо структуры Codable с простыми типами эта фиктивная структура будет иметь вложенные кодируемые структуры:

struct Test: Codable {
   var totalTime: Int
   var questions: [Question]
}

extension Test {
struct Question: Codable {
    let id: String?
    let pregunta: String
    var selectedAnswer: Answer? = nil
    let respuestas: [Answer]
    let idConcepto: Int
    let stats: Stats?
    let categorias: [String]
}

struct Answer: Codable {
    let respuesta: String
    let correcta: Bool
}

struct Stats: Codable {
    let globalStats: GlobalStats?
}

struct GlobalStats: Codable {
    let timesFailed, timesUnanswered, timesAnswered: Int?
}
}

Все работает нормально, когда я создаю проект на локальном хосте. Когда я перемещаюсь по этим конечным точкам в Postman, они возвращают мне ожидаемый ответ.

Проблема возникает, когда я пытаюсь развернуть это в IBM Cloud (также пробовал на Heroku с той же проблемой).

Проблема, которую он дает мне, заключается в следующем

/tmp/app/Sources/Application/Mocks/UserMock.swift:29:44: error: type of expression is ambiguous without more context
              let questionFirst: Test.Question = Test.Question(id: "1", pregunta: "UNO", respuestas: answers, idConcepto: 1, stats: nil, categorias: cats)
                                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Я не знаю, как это решить, Xcode не вызвал никаких ошибок и скомпилировал проект локально без каких-либо проблем, я пытался привести типы и все возможные комбинации для создания структуры, ошибка всегда одна и та же.

Кто-нибудь сталкивался с такой же проблемой? Это ошибка Китуры или я что-то упустил? В документации ничего не сказано о вложенных структурах, единственное, что я нашел относительно вложенных структур, это то, что Kitura ORM не поддерживает вложенные структуры при работе с базой данных ORM и SQL, что не является моим случаем.

Буду очень рад, если мы найдем решение

Спасибо за вашу помощь


person FlashHardcore    schedule 24.07.2020    source источник


Ответы (1)


Мне удалось решить проблему. Как я и подозревал, это была глупость. В структуре Test.Question поле selectedAnswer было инициализировано значением по умолчанию, равным nil.

Когда я создал структуру, я не написал это поле, потому что оно уже имеет значение по умолчанию, но похоже, что Kitura или развертывание Swift на сервере не поддерживают это. Я создаю экземпляр структуры со значением по умолчанию прямо сейчас и работает без проблем.

Я надеюсь, что это может помочь любому в будущем с подобной проблемой

person FlashHardcore    schedule 24.07.2020