我可以使用可选链来为可选属性提供默认值吗?

3
可以同时使用可选链和空合并运算符吗?像这样:
print("Meeting host: " + meeting.host?.email ?? “No host”)

我想这样做,但是我收到一个错误提示,说我的字符串未经过解包。email是一个非可选字符串。

如果不需要事先解包host,这是否可能?如果不行,为什么我的尝试不起作用?


1
如果你遇到了一个“意外”的编译错误,将表达式分解成较小的部分。在你的情况下:从let host = meeting.host?.email ?? "No host" ; print("Meeting host: " + host)开始 - 你会注意到这样编译是成功的,所以可选链和空合并运算符通常是有效的。 - undefined
1
请点击这里查看,https://dev59.com/MaPia4cB1Zd3GeqPtBeu#44877393 - undefined
2个回答

6
您不必将其解包以使其正常工作。这不是错误发生的原因。毕竟, ?? 是设计用于处理这种情况的。
错误是由于运算符优先级引起的。编译器认为应该首先评估 +,将两个字符串连接起来,然后执行nil-coalescing。它看到第二个操作数未被拆包并抱怨。
要产生预期的结果,请通过添加括号明确告诉编译器首先评估 ??。
print("Meeting host: " + (meeting.host?.email ?? “No host”))

1
请注意,使用+的方式可能会导致编译时间爆炸。强烈建议避免在字符串中使用+,这是“我的Swift编译时间太长”的问题的主要原因。一个还好,但即使是两个或三个也会导致指数级问题。养成字符串插值的习惯:print("Meeting host: \(meeting.host?.email ?? "No host")") 这也恰好解决了Sweeper所解释的优先级问题。 - undefined
2
print()接受可变数量的参数,因此我们也可以这样写:print("会议主持人:", meeting.host?.email ?? "无主持人") - undefined

1

有一个更简单的解决方案:

class Host {
    var email: String?
}

var host: Host? = nil
print("Meeting host: " + String(describing: host?.email))

输出结果为:

会议主持人: 空


1
这个不是做同样的事情。host 是一个可选项,所以 host.email 无法编译。 - undefined
但是对于非空值,这将显示“会议主持人:Optional(Bob)”或类似的内容,对吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接