如何在For循环中向下转换为[String:String]?

时间:2015-01-28 17:29:26

标签: ios json swift casting nsdictionary

Swift编程语言指南的type casting部分说当我们知道某个项目是某种类型时,可以在for循环中向下转发:

  

因为已知此数组仅包含Movie实例,所以可以   使用强制转换并直接打开到非可选的电影   类型转换操作符的版本(as):

for movie in someObjects as [Movie] {
   println("Movie: '\(movie.name)', dir. \(movie.director)")
}

我正在尝试为我的解析后的JSON做同样的事情:

{ "data":
   {"promotions": [ 
      { "id": "1", 
        "title": "Some promo",
        "route": "http://www.....jpg" 
      } , 
      { "id": "2",
        "title": "Promo 2",
        "route": "http://www.....jpg" 
      } ] 
   }
}

我的代码:

if let data = json["data"] as? NSDictionary {
    if let promos = data["promotions"] as? NSArray {
        for i in promos as [String: String] { //<- error here
            if i["id"] != nil && i["title"] != nil && i["route"] != nil {
                self.promotions.append(Promotion(id: i["id"], title: i["title"], imageURL: i["route"]))
            }
        }
    }
}

但是,这个显示错误:'String' is not identical to 'NSObject'。 JSON解析没问题,我可以使用这些项目,如果我单独投射它们,所以这个工作:

for i in promos {
    var item = i as [String: String]
    if item["id"] != nil && item["title"] != nil && item["route"] != nil {
        self.promotions.append(Promotion(id: item["id"]!, title: item["title"]!, imageURL: item["route"]!))
    }
}

我在这里缺少什么?为什么我不能在for...in中投射整个数组?

1 个答案:

答案 0 :(得分:4)

在这种情况下,演员表演promos而非i。由于promos[String: String]词典的数组,因此您需要将promos投射到[[String: String]]。执行此操作时,i将具有[String: String]类型,因为它是[[String: String]]数组的一个元素。

for i in promos as [[String: String]] {