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

Posted

技术标签:

【中文标题】如何在 for in 循环中向下转换为 [String: String]?【英文标题】:How to downcast to [String: String] in a for in loop? 【发布时间】:2015-01-28 17:29:26 【问题描述】:

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

由于已知此数组仅包含 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】:

在这种情况下,演员表作用于promos 而不是i。由于promos[String: String] 字典的数组,因此您需要将promos 转换为[[String: String]]。当您这样做时,i 将具有 [String: String] 类型,因为它是 [[String: String]] 数组的一个元素。

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

【讨论】:

我以为是 'i' 投射的,但它实际上是数组,当然……非常感谢!

以上是关于如何在 for in 循环中向下转换为 [String: String]?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 For 循环结果转换为数组,然后在 C# 中计算结果数组的整数?

JS中for...in 语句用于对数组或者对象的属性进行循环操作吗?

for循环与进制转换

如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'

如何在for-of中使用array.slice转换for循环或为生成的列和行映射array.slice?

如何将 for 循环转换为流