!
делает что-то другое, когда оно появляется в obj!
, чем когда оно появляется в as!
.
В obj!
код принудительное развертывание ( или безоговорочно распаковывает) переменную obj
. Это означает, что obj
имеет необязательный тип; мы можем подтвердить, что, взглянув на объявление obj
:
var obj = response.result.value as? [String: Any]
Когда оператор as
имеет постфикс с ?
, возвращаемое значение может быть nil
и, следовательно, результирующий тип является необязательным.
Сравните это со вторым экземпляром !
в вашей программе:
let accounts = obj!["accounts"] as! [[String: Any]]
В этом случае оператор as
выполняет принудительное преобразование; это означает, что преобразование всегда приводит к необязательному типу, но может вызвать ошибку времени выполнения из-за невозможности возврата к nil
.