【问题标题】:Cannot subscript a value of type '[AnyHashable : Any]' with an index of type 'Any?'无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标
【发布时间】:2019-03-08 16:09:28
【问题描述】:

我正在尝试将目标 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] ?? ""
}

但在最后一个常量中:let asset = assets[facilities["content"]] 我得到:

无法使用“Any?”类型的索引为“[AnyHashable : Any]”类型的值下标

有什么帮助吗?

【问题讨论】:

  • scs_name is not here 我想它的类型是String

标签: arrays swift dictionary nsdictionary


【解决方案1】:

你可以试试

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"]

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

【讨论】:

    【解决方案2】:

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

        ...
        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,并将其替换为具有类型属性的适当结构/类,而不必执行所有这些 @987654324 @疯狂。这只是因为使用了字典而不是结构或类而出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2020-02-08
      相关资源
      最近更新 更多