如何解开返回为以下内容的字符串:
(可选(可选“蓝色”))
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"
注意: 与此处介绍的其他方法不同,这将始终产生一个值。 如果任一可选参数为,则使用""
(空String
)nil
。
方法3:
或者,您可以将 nil合并运算符 ??
与 可选绑定一起使用 :
if let value = a ?? nil {
print(value) // "hello\n"
}
这是如何运作的?
用双重包裹可选的,由变量保持的值可以是3件事情之一:Optional(Optional("some string"))
,Optional(nil)
如果内可选的是nil
,或nil
如果外可选的是nil
。因此,?? nil
将外部可选项解包。如果外部可选参数为nil
,则将其??
替换为默认值nil
。如果a
是Optional(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”,然后很好地