我有几行工作代码:
let email = User.sharedInstance.emailAddress ?? ""
accountEmailAddress.text = email
User.sharedInstance
是User
类的非可选实例。其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"
答案 0 :(得分:20)
我想这是因为UILabel.text
的可选性。运算符??
有2个重载 - 一个返回T
,另一个返回T?
。
由于UILabel.text
同时接受String
和String?
,编译器无法决定使用哪个重载,从而引发错误。
您可以通过严格指定结果类型来修复此错误:
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?
尽管如此,编译器应该在这种情况下自动选择非可选类型,因此我建议就此提交错误报告。