当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Swift ??(_:_:)用法及代码示例

用法一

操作符

??(_:_:)

执行 nil-coalescing 操作,返回 Optional 实例的包装值或默认 Optional 值。

声明

func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T?) rethrows -> T?

参数

optional

一个可选值。

defaultValue

用作默认值的值。 defaultValueoptional 具有相同的类型。

详述

nil-coalescing 操作在有值的情况下解开左侧,或者将右侧作为默认值返回。此操作的结果将与其参数的类型相同。

此运算符使用短路评估:首先检查 optional,并且仅当 optionalnil 时才评估 defaultValue。例如:


let goodNumber = Int("100") ?? Int("42")
print(goodNumber)
// Prints "Optional(100)"


let notSoGoodNumber = Int("invalid-input") ?? Int("42")
print(notSoGoodNumber)
// Prints "Optional(42)"

在此示例中,goodNumber 被分配了 100 的值,因为 Int("100") 成功返回了非 nil 结果。当 notSoGoodNumber 初始化时, Int("invalid-input") 失败并返回 nil ,因此调用 Int("42") 以提供默认值。

由于此nil-coalescing 操作的结果本身是一个可选值,因此您可以通过多次使用?? 来链接默认值。第一个不是 nil 的可选值会停止链并成为整个表达式的结果。下一个示例尝试在两个单独的字典中为问候语找到正确的文本,然后再返回到静态默认值。


let greeting = userPrefs[greetingKey] ??
    defaults[greetingKey] ?? "Greetings!"

如果 userPrefs[greetingKey] 有一个值,则将该值分配给 greeting 。如果不是,则 defaults[greetingKey] 中的任何值都会成功,如果不是,则 greeting 将设置为非可选默认值 "Greetings!"

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

用法二

操作符

??(_:_:)

执行 nil-coalescing 操作,返回 Optional 实例的包装值或默认值。

声明

func ?? <T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T

参数

optional

一个可选值。

defaultValue

用作默认值的值。 defaultValueoptionalWrapped 类型相同。

详述

nil-coalescing 操作在左侧有值时解包,或者默认返回右侧。此操作的结果将具有左侧Wrapped 类型的非可选类型。

此运算符使用短路评估:首先检查 optional,并且仅当 optionalnil 时才评估 defaultValue。例如:


func getDefault() -> Int {
    print("Calculating default...")
    return 42
}


let goodNumber = Int("100") ?? getDefault()
// goodNumber == 100


let notSoGoodNumber = Int("invalid-input") ?? getDefault()
// Prints "Calculating default..."
// notSoGoodNumber == 42

在此示例中,goodNumber 被分配了 100 的值,因为 Int("100") 成功返回了非 nil 结果。当 notSoGoodNumber 初始化时, Int("invalid-input") 失败并返回 nil ,因此调用 getDefault() 方法来提供默认值。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 ??(_:_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。