【问题标题】:Cast While Looping Over Dictionary in Swift在 Swift 中循环遍历字典时投射
【发布时间】:2015-07-07 00:53:36
【问题描述】:

我有一个AnyObject 的字典,我想遍历它以获取键和值,但同时将两者都转换为String

var headers: [NSObject : AnyObject] = [:]
headers["Content-Type"] = "application/pdf"

for (key, value) in headers {
    println(key)
    println(value)
}

我认为它会类似于以下内容,但这给了我Type '(String, String)' does not conform to protocol 'SequenceType'

for (key, value) in headers as (String, String) {
    println(key)
    println(value)
}

我知道我可以像(key as! String) 那样内联,但我认为你可以将它转换为循环。非常感谢任何帮助!

【问题讨论】:

  • 不是 swift 专家,但不应该是 for (key, value) as (String, String) in headers 之类的吗?

标签: swift


【解决方案1】:

您要求编译器将 headers 作为字符串元组进行迭代,但 headers 是字典,而不是元组。

解决方案是使用正确的类型一次转换整个headers 字典,键为字符串,值为字符串,如下所示:

for (key, value) in headers as! [String:String] {
    println(key)
    println(value)
}

当然,请注意,如果任何键或值不是字符串,它将崩溃。

如果您不确定所有键和值都是字符串,则必须使用其原始类型迭代字典,然后将其转换为字符串循环中进行安全检查。

【讨论】:

  • 或者你可以使用可选绑定if let dict = headers as? [String: String] { for (key, value) in dict ...
  • 感谢您的及时回复和深入的解释!
  • @vacawama 是的,你是对的。如果我们不确定内容类型,最好检查强制转换是否适用于可选绑定。
  • 顺便说一句,在 Swift 2.0 中,您现在还可以编写 for case let (key as String, value as String) in headers,它只会遍历匹配的元素,而忽略不匹配的元素
  • @vacawama 也可以使用for (key, value) in headers as? [String:String] ?? [:] { },如果您不需要else 用于if let
猜你喜欢
  • 2022-01-11
  • 2023-04-03
  • 2023-03-12
  • 2022-09-22
  • 2013-11-29
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多