我的主要问题是我正在尝试解决(未记录的)事实,即@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) 谷歌搜索让我找到了一般的 Swift 错误处理链接,但我有一个更具体的问题。我认为这里的答案是“不,你运气不好”,但我想仔细检查一下我是否遗漏了一些东西。几年前的这个问题看起来很相似,并且有一些看起来很粗糙的解决方法的答案......我想看看最新版本的 Swift 是否使更优雅的东西成为可能。
情况:我有一个未用 标记的函数throws,并且使用try!。
目标:我想创建一个单元测试来验证,是的,给这个函数错误的东西实际上会失败并抛出(运行时/致命)错误。
问题:
XCTAssertThrows也没有捕获错误。该函数的构建目的是与另一个无声失败的函数具有相同的签名,我在模拟器上将其替换为该函数,以便在测试(自动或手动)期间可以大声失败。所以我不能只是将其更改为抛出函数,因为那样的话另一个函数必须被标记为抛出,并且我希望它默默地失败。
那么,有没有办法抛出一个可以在单元测试中捕获的未处理错误?
或者,我可以在不更改签名的情况下以可测试的方式让这个函数爆炸吗?
我已经构建了一个简单的 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) 在Vapor 2中,您可以执行以下操作:
let query = <some fluent query object>
logger?.debug(query)
Run Code Online (Sandbox Code Playgroud)
它将打印出完整的SQL语句,但现在在Vapor 3中看不到任何有关如何执行此操作的文档。
如何查看我正在生成什么SQL QueryBuilder?