访问引用字典的任意类型数组的下标

Access subscript of array of type any refering to dictionaries

SO 上有很多关于在 ANY 类型的对象数组上使用下标的问题,通常建议将 Any 对象转换为可以采用类似

的下标的变量类型
if let addresses = profile["Addresses"] as? [[String: Any]] 

在我的例子中,数组是一个形式为 (paramName:value) 或 (NSString: Float) 的字典数组,但是,尽管有关于 SO 的所有答案,但我无法弄清楚语法来告诉编译器认为 Any 对象是字典。

我的原始代码产生错误:

func getStringFromSortedArray (sortedArray:Array<Any>) -> String{

for i in 0 ..< sortedArray.count {
  if let paramName = sortedArray[i]["param"]  {
               //run some code
}

我试过了

for i in 0 ..< sortedArray.count {
  if let paramName = sortedArray[i]["param"] as? [[String: Any]]  {
               //run some code
}

,

if let sortedArray = sortedArray as? [[Dictionary: Any]] {                
for i in 0 ..< sortedArray.count {
  if let paramName = sortedArray[i]["param"]  {
               //run some code
}
}

还有很多变化都没有成功。

有人可以指点我更正语法以通知编译器 Any 对象是字典吗?如果有人认为这个问题以前已经回答过,我将不胜感激你给我指出一个包含一系列字典的例子,因为我已经看过不同设置的答案。

如果我理解正确的话,你是说 sortedArray 是像 [[String : Any]] 这样的字典数组。我 相信 你还说键 "param" 包含一个字符串,这就是你试图从这个函数中得到的。如果这是正确的,那么您似乎非常接近,但遗漏了一些东西:

func getStringFromSortedArray (sortedArray:Array<Any>) -> String {
  //If your sortedArray is an array of dictionaries let's cast it as such
  guard let dictionaries = sortedArray as? [[String : Any]] else { return "None Found" }
  for i in 0 ..< dictionaries.count {
    //Now we can loop through the dictionaries, and check that "param" contains a string
    if let paramName = dictionaries[i]["param"] as? String {
      //Now we have a reference to "paramName" and can return it or do whatever "run some code" means
           //run some code
  }
}

当然,如果 guard 语句失败,您将需要自定义发生的情况,如果您的 for 循环完成但没有找到您想要的值,您还必须添加一个有效的 return 值正在寻找。

让我们看看你第一行代码的问题:

  func getStringFromSortedArray (sortedArray:Array<Any>) -> String {

这是错误的,因为你没有说明数组元素的类型。您 知道 它是一个字典数组,但您向编译器隐藏了这一事实。这意味着你不能离开这里去任何地方。

所以如果你知道它是一个字典数组,你应该它是一个字典数组:

  func getStringFromSortedArray (sortedArray:[[AnyHashable:Any]]) -> String {

现在知道的多了就多说吧。例如,如果你知道这些字典中的所有 keys 都是字符串,你应该这样说:

  func getStringFromSortedArray (sortedArray:[[String:Any]]) -> String {

如果你知道字典中的都是同一种类型,你也应该这么说:

  func getStringFromSortedArray (sortedArray:[[String:Float]]) -> String {

声明某物的类型时,始终尽可能具体。