1

我开始使用 Kitura 框架将我当前的 node.js 后端迁移到 swift,并且我开始使用模拟数据实现所有路由。

无论如何,现在我处于非常早期的阶段,并开始开发一些模拟端点并部署在 IBM Cloud 上,没有任何问题,它们运行良好。工作端点的一个示例如下:

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

Mocks ()它是一个类,其中包含预定义所有字段的仪表板结构。这些字段是普通类型(字符串和数字)

当我开始开发更高级的端点时,工作流程是一样的,我用以下代码注册路由

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?
}
}

当我在 localhost 中构建项目时,一切正常。当我在 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 的错误还是我错过了什么?在文档中他们没有说任何关于嵌套结构的事情,我发现唯一与嵌套结构有关的是 Kitura ORM 在使用 ORM 和 SQL 数据库时不支持嵌套结构,这不是我的情况。

如果我们能找到解决方案,我会很高兴

谢谢你的帮助

4

1 回答 1

0

我设法解决了这个问题。正如我所怀疑的那样,这是一件愚蠢的事情。在Test.Question结构中,字段selectedAnswer被初始化为默认值等于nil

当我创建结构时,我没有写该字段,因为它已经有一个默认值,但它看起来像 Kitura 或将 Swift 部署到服务器不支持这一点。我现在用默认值实例化结构并且没有任何问题。

我希望这可以帮助将来遇到类似问题的任何人

于 2020-07-24T17:18:23.833 回答