Я поигрался со Swift и обнаружил, что при приведении объекта к вставке в словарь я получаю странное предупреждение: Treating a forced downcast to 'String' as optional will never produce 'nil'
. Если я заменю as
на as?
тогда предупреждение уходит.
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
Документация Apple гласит следующее
Поскольку даункастинг может потерпеть неудачу, оператор приведения типа может быть двух разных форм. Необязательная форма,
as?
, возвращает необязательное значение типа, который вы пытаетесь уменьшить. Принудительная формаas
пытается выполнить переход вниз и принудительно разворачивает результат как одно сложное действие.
Мне неясно, почему использовать as?
а не as
здесь правильно. Некоторое тестирование показывает, что если я изменю test(), чтобы он возвращал Int вместо String, код завершит работу с ошибкой, если я продолжу использовать as
. Если я перейду на использование as?
тогда код продолжит выполнение в обычном режиме и пропустит этот оператор (dict останется пустым). Однако я не уверен, почему это предпочтительнее. По моему мнению, я бы предпочел, чтобы программа завершилась с ошибкой и дала мне знать, что приведение не было успешным, а затем просто проигнорировал ошибочное утверждение и продолжил выполнение.
Согласно документации, я должен использовать принудительную форму "только тогда, когда вы уверены, что уныние всегда будет успешным". В этом случае я уверен, что обратное преобразование всегда будет успешным, поскольку я знаю, что test()
может возвращать только строку, поэтому я предполагаю, что это идеальная ситуация для принудительной формы понижающего приведения. Так почему компилятор выдает мне предупреждение?