所以我试着

let foo = dict["key"] as? String ?? "empty"
var bar = some_func(string: foo!)

and XCode 6 complains that
Operand of postfix '!' should have optional type; type is 'String'
on the second line.

如果我把第一行改成

let foo: String? = dict["key"] as? String ?? "empty"

错误消失了.

这是某种缺陷还是我做错了什么?

推荐答案

零合并运算符a ?? b

a != nil ? a! : b

它返回左操作数unwrapped或右操作数.所以foo的类型是String,第二行应该是

var bar = some_func(string: foo)

没有感叹号,因为foo不是可选的,无法展开.

(如果将第一行更改为

let foo: String? = dict["key"] as? String ?? "empty"

然后,右侧的结果再次被包装到可选字符串中,并且需要

Swift相关问答推荐

使用SWIFT宏从另一个枚举添加 case

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

如何在init()中使用setter/getters?

SWIFT Vapor控制台应用程序-操作无法完成.权限被拒绝

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

修改数组中每个类实例的属性

在SWIFTUI&39;S视图修改器中使用等待关键字

无法创建MKAssociateRegion对象

与视图交互使工具栏&;标题消失

在扩展中创建通用排序函数

我如何在 swift 中的 viewdidload 之前进行委托?

避免 `(())` 显式指定 Void 类型的枚举关联值

swift 是否遇到 Java 的 2gb 最大序列化大小问题?

如何制作具有 2 个视图的 3D 旋转动画?

Swift 根据总值将数组拆分为块

Swift Swiftui - 将 colored颜色 保存到 UserDefaults 并从 @AppStorage 使用它

如何让动画变慢 SwiftUI

如何根据 SwiftUI 中的字体大小定义按钮的大小?

找不到接受提供的参数的/的重载

Swift:在子类中覆盖 == 导致仅在超类中调用 ==