Неоднозначное использование "??"
У меня есть пара строк рабочего кода:
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"
Ответы
Ответ 1
Я предполагаю, что это связано с опциональностью 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?
Тем не менее, компилятор должен автоматически выбирать необязательные типы в таких ситуациях, поэтому я предлагаю подать отчет об ошибке.