使用swift循环遍历NSDictionary

时间:2015-10-07 16:09:02

标签: ios objective-c swift

我不明白为什么这篇Objective-C代码:

id object = nil;
NSEnumerator *enumerator = ...;
while ((object = [enumerator nextObject])) {...}

无法像这样在Swift中翻译:

var key:AnyObject!
let enumerator:NSEnumerator = myNSDictionary.keyEnumerator()    
while ( (object = enumerator.nextObject()) ) {...}

我有这个错误:

  

类型'()'不符合协议'BooleanType'

2 个答案:

答案 0 :(得分:8)

您应该按如下方式对字典进行枚举(更详细地描述了here):

测试词典声明:

var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

枚举键和值:

for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// YYZ: Toronto Pearson
// LHR: London Heathrow

只列举键:

for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: YYZ
// Airport code: LHR

枚举值:

for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: Toronto Pearson
// Airport name: London Heathrow

也许你有更深层次的理由选择使用NSEnumerator,但如果不是,从Swift的角度来看,上面的内容会更加优雅。

答案 1 :(得分:6)

Objective-C中, [enumerator nextObject]返回对象指针 当枚举所有对象时,nil, 和作业的价值

object = [enumerator nextObject]

等于指定的值。在

while ((object = [enumerator nextObject])) { ... }

只要表达式比较,就会执行while块 不等于0,其中0在这种情况下是空指针常量,通常写为NULL,或nil用于Objective-C指针。以便 循环等同于

while ((object = [enumerator nextObject]) != nil) { ... }

Swift,中,作业没有值(它是Void), 因此

while ( (object = enumerator.nextObject()) )

无法编译。你可以将它强制转换为BooleanType 使其编译但在运行时会崩溃。

enumerator.nextObject()返回AnyObject?,即一个 可选对象,枚举所有对象时为nil。测试nil的返回值的正确方法是 可选绑定

let enumerator = myNSDictionary.keyEnumerator()
while let key = enumerator.nextObject() {
    print(key)
}

(当然,将NSDictionary与Swift Dictionary连接起来 然后使用Swift枚举方法,如中所示 其他答案,是一个明智的选择。)