Swift 对…的语法感到困惑!此代码中的运算符

Swift 对…的语法感到困惑!此代码中的运算符,swift,dictionary,structure,Swift,Dictionary,Structure,我有一个邮件请求。我正在处理存储在obj中的响应。 下面是在顶部声明的var account=account(),account()是字典初始化的类 var obj = response.result.value as? [String: Any] if response.response?.statusCode == 200 { let accounts = obj!["accounts"] as! [[String: Any]]

我有一个邮件请求。我正在处理存储在obj中的响应。 下面是在顶部声明的
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![“帐户”]as![[String:Any]]

我只知道这允许我将响应存储到
self.account
中,我可以使用该数据填充我的视图。有人能详细说明这里到底发生了什么吗

多谢各位

let accounts = obj!["accounts"] as! [[String: Any]]
让我们将该行分解为更小的“块”:

但是记住!
因为你的应用程序可能会崩溃,所以强制打开东西不是一个好的做法。您应该始终选择可选绑定或可选链接。

代码出现在
obj!中时,它会执行不同的操作比它在
中显示为

obj,则代码是(或无条件地展开)变量
obj
。这意味着
obj
是可选类型;我们可以通过查看
obj
的声明来确认:

var obj = response.result.value as? [String: Any]
as
运算符后固定有
时,返回值可能是
nil
,因此结果类型是可选的

将此与
的第二个实例进行对比在您的程序中:

let accounts = obj!["accounts"] as! [[String: Any]]

在这种情况下,
as
运算符正在执行强制转换;这意味着转换将始终导致非可选类型,但它可能会导致运行时错误,因为无法回退到
nil

此代码不可靠。万一发生意外,它会崩溃的。响应值无法转换为字典。最好用if let并移除它。我明白了,它是用来强制展开的。我应该使用if let??(转换为空字典)?
let accounts = obj!["accounts"] as! [[String: Any]]