Запутался по синтаксису! оператор в этом коде - PullRequest
0 голосов
/ 21 января 2020

У меня есть почтовый запрос. Я работаю с ответом, который хранится в объекте. Вверху var account = Account() объявлено следующее, который Account () является инициализированным словарем классом.

var obj = response.result.value as? [String: Any]

            if response.response?.statusCode == 200 {
                let accounts = obj!["accounts"] as! [[String: Any]]
                accounts.forEach { a in
                    let acc = Account(dic: a)
                    self.account = acc
                }
            }

Я очень озадачен этим синтаксисом, которого я пока не понимаю: let accounts = obj!["accounts"] as! [[String: Any]]

Я просто знаю, что это позволяет мне сохранить ответ в self.account, который я могу использовать эти данные, чтобы заполнить мой взгляд. Может кто-нибудь помочь уточнить, что именно здесь происходит?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2020

! делает что-то другое, когда оно появляется в 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.

0 голосов
/ 21 января 2020
let accounts = obj!["accounts"] as! [[String: Any]]

Давайте разберем эту строку на более мелкие «куски»:

obj! // Force unwraps the object "obj" (which is a dictionary) (will crash if "obj" is nil
obj!["accounts"] // After being unwrapped tries to access the key "accounts" inside the dictionary
as! [[String: Any]]// Is going to "cast" or treat the above dictionary as an Array of Dictionaries of String: Any (again forcing it and crash if it cannot)

Но помните!

Не рекомендуется принудительно развертывать вещи, поскольку ваше приложение может создать sh. Вы должны всегда go для дополнительных привязок или дополнительных цепочек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...