我目前有这样的代码:

if let isSaved = vm.place?.isSaved {
    Text(isSaved ? "Saved" : "Want to go")
} else {
    Text("Want to go")
}

我如何重写这段代码,以避免本质上必须两次使用Text视图的"Want to Go"版本?

如果我试一试:

Text(vm.place?.isSaved ? "Saved" : "Want to go")

我得到的错误是:

可选类型‘Bool?’的值必须展开为"Bool"类型的值

推荐答案

事实上,vm.place?.isSaved返回Optional<Bool>,其中有3个 case :

.none
.some(true)
.some(false)

这就是你不能直接使用三元运算符的原因.

您可以通过忽略以下情况来消除可选性:

Text(vm.place?.isSaved == true ? "Saved" : "Want to go")

或者为其指定一个默认值,如下所示:

Text(vm.place?.isSaved ?? false ? "Saved" : "Want to go")

也许将代码分开一点有助于更清楚地说明:

let optionalIsSaved: Optional<Bool> = vm.place?.isSaved
let defaultedIsSaved: Bool = optionalIsSaved ?? false
Text(defaultedIsSaved ? "Saved" : "Want to go")

Swift相关问答推荐

如何将趋势线添加到线性图中?

如何将泛型函数存储到变量中?

如何设置两个不同的视图模型以在我的SwiftUI应用程序中使用相同的数据源?

SwiftUI map 旋转

NSApplication是否需要NSApplicationDelegate?

在Xcode SWIFT中运行用Ionic编写的函数

暂停我的 AR 会话并清除变量和锚点的功能

标有@MainActor 的函数中的异步调用是否也在主线程上运行?

状态变量更改后,SwiftUI 视图不会更改

如何在 Swift 中对单个单词进行词形还原

签署GoogleSignIn-GoogleSignIn需要开发团队

供应和普通数组中具有空值的 map 函数的行为不一致?

如何在 Swift 中的两个 UIView 中心之间添加线?

如何在 SwiftUI 中正确实现Collection 夹?

如何将使用\u{ea12}创建的 Swift 字符串转换回其十六进制值/字符串ea12?

FirebaseStorage:如何删除目录

iOS 判断应用程序是否可以访问麦克风

EXC_BREAKPOINT 崩溃的原因范围

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey

如何在 iOS 上的 Swift 中获取 sharedApplication?