gpt4 book ai didi

swift - Nil Coalescing (??) 运算符在 swift 中是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 00:35:45 26 4
gpt4 key购买 nike

我的 Playground code :

let nickName: String? = nil
let fullName: String = "John Appleseed"

let informalGreeting = "Hi \(nickName ?? fullName)"

Hi John

let informalGreeting2 = "Hi \(fullName ?? nickName)"

Hi Optional("John Appleseed")


我以为我明白了第一种情况

let informalGreeting = "Hi \(nickName ?? fullName)"

nickName 为 nil,因此输出必须为 "Hi\(fullName)"=> "Hi John Appleseed"

第二种情况

let informalGreeting2 = "Hi\(fullName ?? nickName)"

第一个值 fullName 不是 nil ,所以在我看来输出应该是 "Hi\(fullName)"=> "Hi John Appleseed"。

但是为什么输出是像这里这样的可选包装输出

Hi Optional("John Appleseed")

最佳答案

有两个??操作符:

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

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

如果我们通过忽略第二个参数来简化声明一个可能抛出的自动关闭,我们得到

public func ??<T>(optional: T?, defaultValue: T) -> T    // (1)

public func ??<T>(optional: T?, defaultValue: T?) -> T? // (2)

nickName ?? fullName,第一个参数是可选的第二个是非可选的,这意味着第一个变体是使用,结果是一个非可选的:

nickName ?? fullName   // (String? ?? String) -> String

如果 nickName != nil 那么结果是展开的 (!) nickName,否则 fullName

fullName ?? nickName,第一个参数是非可选的第二个是可选的。这不符合任何那些函数声明。

编译器所做的是将第一个参数“包装”成一个可选以使其编译(使用第二个变体)。结果是可选的:

fullName ?? nickName   // (String? ?? String?) -> String?

结果总是Optional(fullName)

在编译项目中你也会得到警告

warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used

The second variant is usually used when chaining nil-coalescing operators:

let result = optA ?? optB ?? optC ?? nonOptD
(2) (2) (1)

关于swift - Nil Coalescing (??) 运算符在 swift 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43321826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com