Подтвердить что ты не робот

Неоднозначное использование "??"

У меня есть пара строк рабочего кода:

    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"
4b9b3361

Ответ 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?

Тем не менее, компилятор должен автоматически выбирать необязательные типы в таких ситуациях, поэтому я предлагаю подать отчет об ошибке.