如何在 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 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'