0

我正在尝试将目标 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 assets = assets[facilities["content"]] 我得到:

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

有什么帮助吗?

4

2 回答 2

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?疯狂的事情。这只是因为使用了字典而不是结构或类而出现。

于 2019-03-08T20:32:23.177 回答
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

于 2019-03-08T16:14:42.823 回答