不能使用“Any”类型的索引下标“[AnyHashable:Any]”类型的值

问题描述 投票:0回答:2

我正在尝试将目标c函数转换为swift。

   +(NSString *)extractNameWithDictionary:(NSDictionary *)dictionary
{

   NSDictionary *assets = dictionary[@"assets"];
   NSDictionary *item = dictionary[@"item"];
   NSArray *facilityAssets = item[@"assets"];
   NSDictionary *facilities = facilityAssets[0];
   NSDictionary *asset = assets[facilities[@"content"]];

   return asset[scs_name] ? : @"";
}

func extractNameWithDictionary(dictionary: [AnyHashable : Any]) -> String {
    guard let assets = dictionary["assets"] as? [AnyHashable : Any],
    let item = dictionary["item"] as? [AnyHashable : Any],
    let facilityAssets = item["assets"] as? [Any],
    let facilities = facilityAssets[0] as? [AnyHashable : Any],
    let asset = assets[facilities["content"]] else { return "" }

    return asset[scs_name] ?? ""
}

但在最后一个常数:让资产=资产[设施[“内容”]]我得到:

不能使用“Any”类型的索引下标“[AnyHashable:Any]”类型的值

对此有何帮助?

arrays swift dictionary nsdictionary
2个回答
0
投票

你可以试试

func extractNameWithDictionary(dictionary: [String : Any]) -> String {
    guard let assets = dictionary["assets"] as? [String : Any],
          let item = dictionary["item"] as? [String : Any],
          let facilityAssets = item["assets"] as? [Any],
          let facilities = facilityAssets[0] as? [String : Any],
          let asset = assets[facilities["content"] as? String ?? "" ] as? [String:Any] else { return "" }

  return asset[scs_name] as? String ?? ""

}

这个

facilities["content"]

返回Any,你不能在名为assets的字典中使用,因为它的关键是AnyHashable类型


0
投票

最简单的方法是继续卸载系统以包含内容步骤:

    ...
    let facilities = facilityAssets[0] as? [AnyHashable : Any],
    let content = facilities["content"] as? String,
    let asset = assets[content] as? [AnyHashable: String]
    else { return "" }

你可能会从那里继续收紧你的类型:

func extractNameWithDictionary(dictionary: [String : Any]) -> String {
    guard let assets = dictionary["assets"] as? [String : Any],
        let item = dictionary["item"] as? [String : Any],
        let facilityAssets = item["assets"] as? [[String : Any]],
        let content = facilityAssets.first?["content"] as? String,
        let asset = assets[content] as? [String: String],
        let name = asset[scs_name]
        else { return "" }

    return name
}

然而,当你在这个项目上工作更多时,你将完全摆脱那个NSDictionary,并用一个具有类型属性的正确结构/类替换它,而不是必须做所有这些as?疯狂。这只是因为使用字典而不是结构或类而出现。

© www.soinside.com 2019 - 2024. All rights reserved.