为 Swift 中的Optional提供默认值?

2024-05-25

如果您只想在 nil 的情况下提供默认值,那么在 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的Option monad(与Swift的Optional的想法基本相同)有以下方法getOrElse以此目的:

val myValue = optionalValue.getOrElse(defaultValue)

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


Update

Apple 现在添加了一个合并运算符:

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 method

Note: 我开始了module https://github.com/drewag/SwiftPlusPlus添加像这样的通用助手or on Optional迅速。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Swift 中的Optional提供默认值? 的相关文章

随机推荐

  • 有没有类似RegexBuddy的在线正则表达式分析器? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个在线实用程序 可以美化正则表达式并向其添加解释性注释 有吗 我喜欢在线工具 http regexr com http reg
  • HashMap何时以及如何将桶从链表转换为红黑树? [复制]

    这个问题在这里已经有答案了 我正在研究 java 8 功能 发现当存储桶上的条目集数量增加时 哈希图使用红黑树而不是链表 但是 这是否不需要密钥是可比较的或存在某种密钥排序以及这是如何工作的 这种转变何时真正发生以及如何发生 当有at le
  • 卷曲:参数列表太长

    我想通过 Sparkpost API 使用curl post 发送一封附有pdf 文件的电子邮件 插入我使用的 pdf 我的 test pdf 约为 200KB data cat test pdf base64 wrap 0 但不知怎的 这
  • Laravel 总结雄辩集

    如何对已预先加载的数据集求和 这是我的表结构 regions table Field Type Null Key Default Extra id int 10 unsigned NO PRI NULL
  • 使用 mechanize 和 beautiful soup 在 python 中进行原始 HTML 与 DOM 抓取

    我正在尝试编写一个程序 作为示例 该程序将从该网页上刮掉最高价格 http www kayak com flights JFK PAR 2012 06 01 2012 07 01 1adults http www kayak com fli
  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • Django 单元测试数据库没有被拆除?

    我编写了一些单元测试来测试我的 Django 应用程序 特别是一个测试套件中包含大量代码setUp 功能 所述代码的目的是为数据库创建测试数据 是的 我了解固定装置 并且选择在这种情况下不使用它们 当我运行单元测试套件时 运行的第一个测试通
  • Cocoa 我可以隐藏/显示 NSTextField / NSSecureTextField

    有没有办法在 Cocoa 中打开和关闭 secureTextField 操作系统 我希望用户可以选择查看他们的密码 在 iOS 中 我可以执行类似 textField setSecureTextEntry YES 的操作 我找到了 secu
  • 如何以编程方式检测 Android 设备是否与 USB OTG 连接

    我正在使用定制 OTG 指纹扫描仪 我想检查 OTG 是否已连接到我的 Android 设备或未在特定的 Android 活动中 public class BootUpReceiver extends BroadcastReceiver p
  • PHP:从字符串中修剪子字符串的最佳方法

    想要处理一组字符串 并修剪一些结尾 myEnding 从最后每个字符串的如果存在的话 最简单的方法是什么 我知道使用正则表达式一切皆有可能 但这似乎是一项简单的任务 我想知道是否存在一个简单的工具来实现这一点 Thanks Gidi 我选择
  • GitHub MarkDown:可以使用宏和变量吗?

    我一直在学习 github markdown 我有一个关于变量和宏的问题 是否可以定义变量或宏来防止重复打印文本块 用例是我有一个表生成一个大的超链接网格 链接如下所示 http www a big long big big long hy
  • 在名称为 [重复] 的 DispatcherServlet 中未找到带有 URI 的 HTTP 请求的映射...

    这个问题在这里已经有答案了 我已经检查了 stackoverflow 上几乎所有相关文章 但我就是无法解决我的问题 这是代码 网络 xml
  • Python textwrap.wrap 导致 \n 问题

    所以我只是重新格式化了一堆代码以合并textwrap wrap 却发现我所有的 n都消失了 这是一个例子 from textwrap import wrap def wrapAndPrint msg width 25 wrap msg to
  • 超时后无法部署到 AWS Elastic Beanstalk

    我是 AWS Elastic Beanstalk 的新手 这是我第一次遇到此问题 我尝试通过将我的应用程序 zip 上传到实例来部署新版本 更新完成后出现错误 已完成 但命令行超时 我增加了配置文件中的超时并重新部署 之后我收到了此消息 在
  • Junit测试中LocalDateTime反序列化的问题

    我有问题LocalDateTime反序列化Junit测试 我有简单的REST API返回一些DTO目的 当我呼叫端点时 响应没有问题 它是正确的 然后我尝试编写单元测试 得到MvcResult并使用ObjectMapper将其转换为我的DT
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • CSS 中“body > *”是什么意思?

    我试图了解 jQTouch 实现的 CSS 效果 http www jqtouch com http www jqtouch com 它有一些 CSS 定义 其中包含如下语法body gt body gt webkit backface v
  • 为什么这个基本的 imagejpeg() resizer 返回黑色图像?

    EDIT 感谢您的所有回答 特别是 Mailerdaimon 他注意到我没有在imagecopyresampled功能 我不再得到黑色图像 但我仍然得到一些黑色部分 所以我认为我的比例公式应该更新 如果我上传横向图像 新图像的高度小于 17
  • 在 Objective-C 中使用类别重写方法

    我可以使用类类别来覆盖已使用类别实现的方法吗 像这样 1 原始方法 BOOL method return true 2 重写方法 BOOL method NSLog error return true 这可行吗 还是非法的 From 苹果文
  • 为 Swift 中的Optional提供默认值?

    如果您只想在 nil 的情况下提供默认值 那么在 Swift 中处理可选值的习惯用法似乎过于冗长 if let value optionalValue do something with value else do the same thi