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

Быстрое необязательное присвоение переменной со значением по умолчанию (двойные вопросительные знаки)

Итак, я пытался сделать

let foo = dict["key"] as? String ?? "empty"
var bar = some_func(string: foo!)

и XCode 6 жалуется, что Operand of postfix '!' should have optional type; type is 'String'
на второй линии.

Если я изменил первую строку на

let foo: String? = dict["key"] as? String ?? "empty"

ошибка исчезает.

Это какой-то недостаток, или я просто делаю что-то неправильно?

4b9b3361

Ответ 1

Оператор nil-coalescing a ?? b является ярлыком для

a != nil ? a! : b

он возвращает либо развернутый левый операнд, либо правый операнд. Таким образом, тип foo равен String, а вторая строка должна быть

var bar = some_func(string: foo)

без восклицательного знака, потому что foo не является необязательным и не может быть распакован.

(Если вы измените первую строку на

let foo: String? = dict["key"] as? String ?? "empty"

то результат правой стороны снова завернут в необязательную строку и потребует который будет развернут во второй строке. Это заставляет ошибку уйти, но это, вероятно, не то, что вы хотите.)

Ответ 2

Ваш foo будет String не a String?, потому что оператор объединения nil ?? либо разворачивает ваш условный листинг, если он .some (в результате получается String), либо он будет использовать "empty", который также является String.