当前位置: 首页 > 面试题库 >

如何解开double可选项?

於和志
2023-03-14
问题内容

如何解开返回为以下内容的字符串:

(可选(可选“蓝色”))

var cityName = String()

if let cityAnno = annotation as MGLAnnotation! {
    cityName = String(stringInterpolationSegment: cityAnno.title!)
}

cityLabelName.text = ("\(cityName), \(county)")

cityLabelName打印为 (Optional "New York")


问题答案:

给定一个double可选,如以下双重包装String

let a: String?? = "hello"
print(a as Any) // "Optional(Optional("hello"))\n"

@Leo 表明您可以使用 可选绑定 两次:

if let temp = a, let value = temp {
    print(value) // "hello\n"
}

或强制解开两次:

print(value!!)  // don't do this - you're just asking for a crash

您可以使用以下5种方法来安全解开double可选:

方法1:

您还可以使用 模式匹配

if case let value?? = a {
    print(value) // "hello\n"
}

正如@netigger在回答中指出的那样,它也可以写成:

if case .some(.some(let value)) = a {
    print(value) // "hello\n"
}

简洁性虽然较差,但较容易阅读。

方法2:

另外,您可以两次使用 nil合并运算符 ??

print((a ?? "") ?? "")  // "hello\n"

注意: 与此处介绍的其他方法不同,这将始终产生一个值。 如果任一可选参数为,则使用""(空Stringnil

方法3:

或者,您可以将 nil合并运算符 ??可选绑定一起使用

if let value = a ?? nil {
    print(value)  // "hello\n"
}

这是如何运作的?

用双重包裹可选的,由变量保持的值可以是3件事情之一:Optional(Optional("some string"))Optional(nil)如果内可选的是nil,或nil如果外可选的是nil。因此,?? nil将外部可选项解包。如果外部可选参数nil,则将其??替换为默认值nil。如果aOptional(nil)??则将打开外部可选的包装nil。在这一点上,你将有一个String?就是nil如果任何内部或外部可选的nil。如果有String内部,则得到Optional("some string")

最后,如果两个可选参数中的任意一个为且跳过了该块,则 可选绑定if let)解开Optional("some string")以获得"some string"可选绑定 失败nil

方法4:

此外,您还可以使用flatMap带有 可选的结合

if let value = a.flatMap({ $0 }) {
    print(value)  // "hello\n"
}

方法5:

有条件地将值强制转换为类型。令人惊讶的是,这将删除所有级别的可选选项:

let a: String?? = "hello"
let b: String??????? = "bye"

if let value = a as? String {
    print(value)  // "hello\n"
}

print(b as Any)  // "Optional(Optional(Optional(Optional(Optional(Optional(Optional("bye")))))))\n"

if let value = b as? String {
    print(value)  // "bye\n"
}


 类似资料:
  • 问题内容: 您如何正确地拆开普通选项和隐式选项? 这个主题似乎有些混乱,我只想对所有方法以及它们如何有用提供参考。 当前有两种创建可选项的方法: 有两种解开包装的方式吗?另外,使用和展开过程之间有什么区别? 问题答案: 有很多相似之处,只有少数区别。 (常规)可选 宣言: 不安全地展开: 安全地测试存在: 通过绑定安全地展开: 安全链接: 安全合并零值: 隐式展开的可选 宣言: 不安全地展开(隐式

  • 问题内容: 给定的数组具有可选和非可选值的混合,例如: 我们怎样才能提取的值的类型(如果有的话),所以我们可以创建一个通用的打印功能,仅打印出的值。 例如,此printArray函数通过并打印每个元素: 将输出: 我们如何更改它,以便它仅打印基础值,以便在“可选”时解开该值?例如: 更新进度… 将参数更改为时,它可以工作,例如: 这将打印所需的: 但是仍然想看看我们如何解开Optional,因为返

  • 问题内容: 我正在实现一个接口,该接口的功能类似于可以包含某种对象的表的功能。该接口指定以下功能: 在我的实现中,我感到很困惑的是,我将表数据存储在2D 数组()中。当我需要返回值时,我想执行以下操作(假定只在包含double的列上调用,因此将没有): 但是- Java不允许强制转换为。将其强制转换为可以,因为它是一个对象,而不是基元,但是我的接口指定数据将以形式返回。 所以我有两个问题: 有什么

  • 我正在学习编程入门课程(java),我很想理解为什么java中原始数据类型的范围是原样的。当涉及到像一个字节这样的类整数数据类型时,似乎很容易理解为什么它只接受从-128到127的值;一个字节的大小是8位,最多可以取256个值,所以我们可以给这256个值中的每一个赋一个自然数,我相信这就是幕后发生的事情。它还解释了为什么128被排除在外:我们有128个负数,127个正数,还有零。这些加起来已经有2

  • 这是另一个StackOverflow问题的代码段: 我真的很难理解选修课的用法。返回代码是“返回映射(字符串)的值”还是NULL(如果失败)? return如何作用于方法而不是类-这是可选的。不可数()?

  • 我使用的是Windows 7机器,其"控制面板\时钟,语言和区域"是丹麦" 根据扫描仪的文档: 扫描仪的初始区域设置是Locale.getDefault()方法返回的值; 但当我运行代码时: 它输出“en_US”,然后抛出一个java。util。sc.nextDouble()处的输入不匹配异常。当扫描器初始化为“1,0”时,它工作 但是,如果我明确设置了区域设置: 它输出“en_US”,然后很好地