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

Posted

技术标签:

【中文标题】无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标【英文标题】:Cannot subscript a value of type '[AnyHashable : Any]' with an index of type '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 【参考方案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 @疯狂。这只是因为使用了字典而不是结构或类而出现。

【讨论】:

以上是关于无法使用“Any?”类型的索引为“[AnyHashable:Any]”类型的值下标的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法使用“UIImagePickerController.InfoKey”类型的索引为“[String:Any]”类型的值下标 [重复]

无法使用“UIImagePickerController.InfoKey”类型的参数为“[String : Any]”类型的值下标

无法将类型“x”的值转换为预期的参数类型“[String:Any]”

无法强制将“GraphRequestResult<GraphRequest>”类型的值转换为“[Any]”类型

TypeScript Err:“元素隐式具有‘any’类型,因为‘any’类型的表达式不能用于索引类型

类型 'IResolvers<any, any>' 不可分配给类型 'GraphQLResolverMap<any>'。索引签名不兼容