如何在 Swift 中访问 [String: Any] 字典上的值

Posted

技术标签:

【中文标题】如何在 Swift 中访问 [String: Any] 字典上的值【英文标题】:How do I access a value on an [String: Any] Dictionary in Swift 【发布时间】:2021-12-16 23:26:18 【问题描述】:

目前,我有一个字典,上面有值,其中一些是对象,字典中的值如下

["otherUserId": id,
"otherUser": 
    email = "zak@test.co.uk";
    name = zakmint;
    profileImageURL = "url";
 ,
"lastMessage": 
    fromId = id;
    hasReadMessage = 0;
    text = What;
    timestamp = 1635800286;
    toId = id;
    type = TEXT;
,
"timeStamp": 1635800286]

如何访问 hasReadMessage 的值,我目前正在像这样抓取字典,然后尝试访问它上面的值。但它具有 Any 类型,我不确定如何访问该值而不导致编译错误。

                if let childSnapshot = child as? DataSnapshot 
                    guard let dictionary = childSnapshot.value as? [String: Any] else  return 
                    print(dictionary)
                    let lastMessage = dictionary["lastMessage"]
                
                    let value = lastMessage.hasReadMessage

【问题讨论】:

lastMessage as? [String: Any]。您已经将childSnapshot.value 转换为字典,只需再次执行相同操作即可。 您继续像在保护声明中所做的那样作为该保护声明的一部分或单独的if let … 进行投射。另一种方法是使用自定义类型。 @EmilioPelaez 我得到了同样的错误“'[String : Any] 类型的值?'没有成员“hasReadMessage”” let lastMessage = dictionary["lastMessage"] as? [String: Any] --> let value = lastMessage?["hasReadMessage"] as? Int 【参考方案1】:

您不能将字典视为结构。键是不是可以通过点符号访问其值的属性。

您必须使用密钥订阅并有条件地将每个中间值向下转换为正确的类型

guard let childSnapshot = child as? DataSnapshot, 
      let dictionary = childSnapshot.value as? [String:Any],
      let lastMessage = dictionary["lastMessage"] as? [String:Any],
      let hasReadMessage = lastMessage["hasReadMessage"] as? Bool else  return 

print(hasReadMessage)
               

【讨论】:

以上是关于如何在 Swift 中访问 [String: Any] 字典上的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 Alamofire 读取本地 JSON

如何从 Swift 中的字符串路径访问安全范围资源?

Swift:如何在 plist 的数组中读取多个数组?

Swift3 Json Parsing - 如何访问相关字段

Swift UI - 如何从外部访问 @State 变量?

在 swift 中使用 alamofire 发送 JSON 数组作为参数