在Swift中处理选项的习惯用法似乎过于冗长,如果您只想在值为零的情况下提供一个默认值:

if let value = optionalValue {
    // do something with 'value'
} else {
    // do the same thing with your default value
}

涉及不必要的代码复制,或者

var unwrappedValue
if let value = optionalValue {
    unwrappedValue = value
} else {
    unwrappedValue = defaultValue
}

这要求unwrappedValue不是一个常数.

Scala的选项monad(与Swift的可选选项基本相同)具有用于此目的的方法getOrElse:

val myValue = optionalValue.getOrElse(defaultValue)

我错过什么了吗?Swift 已经有了一个紧凑的方法来实现这一点吗?或者,如果做不到这一点,是否可以在可选的扩展中定义getOrElse

推荐答案

Update

苹果现在增加了一个聚合运营商:

var unwrappedValue = optionalValue ?? defaultValue

在这种情况下,三元运算符是你的朋友

var unwrappedValue = optionalValue ? optionalValue! : defaultValue

您还可以为可选枚举提供自己的扩展:

extension Optional {
    func or(defaultValue: T) -> T {
        switch(self) {
            case .None:
                return defaultValue
            case .Some(let value):
                return value
        }
    }
}

然后你可以做:

optionalValue.or(defaultValue)

然而,我建议坚持使用三元运算符,因为其他开发人员可以更快地理解这一点,而无需研究or方法

Note:我创建了一个module,将Optional上的or这样的普通助手添加到swift中.

Swift相关问答推荐

如何使用swift宏生成一个带有关联值的枚举?

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

为什么这个快速代码不显示文本字段?

如何增加 NSStatusBar 图像大小?

如何使 onKeyPress 与 TextField 快速配合使用?

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

从 Obj-C 函数返回 swift 类的不兼容指针类型

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

Swift - 订阅视图之外的绑定值

RxSwift 提高性能

Swift 非参与者隔离闭包

响应 UITextField (UIViewRepresentable) 中的特定按键

如何获得不同的插入和移除过渡动画?

如何让不同的组件拥有不同的动画?

SwiftUI:从存储在 observableObject 中的数组中删除对象时查看崩溃

如何仅将 SwiftUI 不透明度应用于父视图?

让我的函数计算数组 Swift 的平均值

从 NSData 对象在 Swift 中创建一个数组

由于编译器中的内部保护级别,无法访问框架 init 中的公共 struct

在这个例子中美元符号有什么作用?