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

时间:2018-10-17 15:58:24

标签: ios swift types any

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

if let addresses = profile["Addresses"] as? [[String: Any]] 

在我的情况下,数组是(paramName:value)或(NSString:Float)形式的字典数组,但是,尽管有SO的所有答案,但我无法弄清楚语法来告诉编译器任何对象都是字典。

我的原始代码会产生错误:

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对象是一个字典吗?如果有人认为这个问题已经被回答过了,那么我希望您能举一个带有多个字典的示例,因为我已经查看了具有不同设置的答案。

2 个答案:

答案 0 :(得分:2)

让我们来看一下第一行代码中的问题:

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

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

因此,如果您知道它是一个字典数组,则应该 say 它是一个字典数组:

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

现在,如果您了解更多,您应该多说。例如,如果您知道这些词典中的所有是字符串,则应这样说:

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

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

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

在声明事物的类型时,请尽可能具体。

答案 1 :(得分:0)

如果我正确理解您的意思,就是说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循环完成而没有找到您要查找的值,那么您还必须添加一个有效的返回值。