Быстрое необязательное присвоение переменной со значением по умолчанию (двойные вопросительные знаки)
Итак, я пытался сделать
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"
ошибка исчезает.
Это какой-то недостаток, или я просто делаю что-то неправильно?
Ответы
Ответ 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
.