小编Ell*_*ock的帖子

结合@Published 属性:在更新期间从别处获取当前值

我的主要问题是我正在尝试解决(未记录的)事实,即@Published在订阅者收到更改通知后,属性不会更新属性的值。我似乎无法找到解决它的好方法。

考虑以下 aSubject@Published属性的人为组合。首先是一个简单的类:

class StringPager {
    @Published var page = 1
    @Published var string = ""
}
let pager = StringPager()
Run Code Online (Sandbox Code Playgroud)

然后是一个简单的传递主题:

let stringSubject = PassthroughSubject<String, Never>()
Run Code Online (Sandbox Code Playgroud)

为了调试,让我们订阅字符串属性并打印出来:

pager.$string.sink { print($0) }
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。接下来,让我们订阅主题并根据其值更改寻呼机:

stringSubject.sink { string in
  if pager.page == 1 {
    pager.string = string
  } else {
    pager.string = string.uppercased()
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这个逻辑可以让我们在不在第一页时将寻呼机字符串设为大写。

现在让我们在页面更新时通过 stringSubject 发送值:

pager.$page.sink { 
  $0 == 1 ? stringSubject.send("lowercase") : stringSubject.send("uppercase") 
}
Run Code Online (Sandbox Code Playgroud)

如果我们正确地理解了这个逻辑,那么小写将始终为小写,而大写将始终为大写。不幸的是,事实并非如此。这是一个示例输出:

pager.page = 1 // lowercase
pager.page …
Run Code Online (Sandbox Code Playgroud)

ios swift combine

14
推荐指数
2
解决办法
6940
查看次数

验证 Swift 中抛出运行时错误的单元测试

谷歌搜索让我找到了一般的 Swift 错误处理链接,但我有一个更具体的问题。我认为这里的答案是“不,你运气不好”,但我想仔细检查一下我是否遗漏了一些东西。几年前的这个问题看起来很相似,并且有一些看起来很粗糙的解决方法的答案......我想看看最新版本的 Swift 是否使更优雅的东西成为可能。

情况:我有一个未用 标记的函数throws,并且使用try!

目标:我想创建一个单元测试来验证,是的,给这个函数错误的东西实际上会失败并抛出(运行时/致命)错误。

问题:

  1. 当我将此函数包装在 do-catch 中时,编译器警告我 catch 块无法访问。
  2. 当我运行测试并传递错误的参数时, do-catch 不会捕获错误。
  3. XCTAssertThrows也没有捕获错误。

该函数的构建目的是与另一个无声失败的函数具有相同的签名,我在模拟器上将其替换为该函数,以便在测试(自动或手动)期间可以大声失败。所以我不能只是将其更改为抛出函数,因为那样的话另一个函数必须被标记为抛出,并且我希望它默默地失败。

那么,有没有办法抛出一个可以在单元测试中捕获的未处理错误?

或者,我可以在不更改签名的情况下以可测试的方式让这个函数爆炸吗?

error-handling try-catch swift swift5

8
推荐指数
1
解决办法
1262
查看次数

在 Heroku 上使用 Vapor 3 配置 PostgreSQL DB

我已经构建了一个简单的 Vapor 3 API,我想将其部署在 Heroku 上。我希望它得到一个 PostgreSQL 数据库的支持,该数据库也附加到另一个 Heroku 应用程序(我已经成功地在 Heroku 仪表板中附加了数据库 - 并且该数据库在另一个应用程序中正常工作)。但是,我的 Vapor 应用程序从未完成启动,并因以下错误而崩溃:

Fatal error: Error raised at top level: ?? PostgreSQL Error: no pg_hba.conf entry for host "[the IP addr]", user "[heroku postgres username here]", database "[heroku psql db here]", SSL off
- id: PostgreSQLError.server.fatal.ClientAuthentication
Run Code Online (Sandbox Code Playgroud)

我曾经vapor heroku init设置过 Heroku 应用程序。我已经谷歌搜索,并尝试添加 aProcfile并弄乱configure.swift,但到目前为止还没有运气。以下是我能想到的所有相关文件:

简介:

web: Run serve --env production --hostname 0.0.0.0 --port $PORT --config:postgresql.url $DATABASE_URL
Run Code Online (Sandbox Code Playgroud)

配置.swift:

import FluentPostgreSQL
import Vapor

/// Called …
Run Code Online (Sandbox Code Playgroud)

heroku heroku-postgres swift vapor

5
推荐指数
1
解决办法
970
查看次数

如何在Vapor 3 / Fluent中记录SQL语句?

在Vapor 2中,您可以执行以下操作:

let query = <some fluent query object>
logger?.debug(query)
Run Code Online (Sandbox Code Playgroud)

它将打印出完整的SQL语句,但现在在Vapor 3中看不到任何有关如何执行此操作的文档。

如何查看我正在生成什么SQL QueryBuilder

postgresql vapor

4
推荐指数
1
解决办法
378
查看次数