模糊地使用“??”

时间:2014-09-02 09:29:36

标签: swift

我有几行工作代码:

    let email = User.sharedInstance.emailAddress ?? ""
    accountEmailAddress.text = email

User.sharedInstanceUser类的非可选实例。其emailAddress属性是可选的String?accountEmailAddress是UILabel。

如果我尝试将其转换为单行代码:

    accountEmailAddress.text = User.sharedInstance.emailAddress ?? ""

我得到了Swift编译器错误"模糊地使用' ??'"。

我无法弄清楚这里使用nil合并算子的含义是什么。我想找出编译器为什么抱怨,并且出于好奇,是否有办法让这个版本变得简洁。

(Xcode 6 beta 6。)

编辑:在操场上最小化的再现:

// Playground - noun: a place where people can play
var foo: String?
var test: String?

// "Ambiguous use of '??'"
foo = test ?? "ValueIfNil"

1 个答案:

答案 0 :(得分:20)

我想这是因为UILabel.text的可选性。运算符??有2个重载 - 一个返回T,另一个返回T?

由于UILabel.text同时接受StringString?,编译器无法决定使用哪个重载,从而引发错误。

您可以通过严格指定结果类型来修复此错误:

String(User.sharedInstance.emailAddress ?? "")

(User.sharedInstance.emailAddress ?? "") as String

// or, when String! will become String? in the next beta/gm

(User.sharedInstance.emailAddress ?? "") as String?

尽管如此,编译器应该在这种情况下自动选择非可选类型,因此我建议就此提交错误报告。