用swift在NSDictionary上循环



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

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

在Swift中不能这样翻译:

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

我有这个错误:

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

您应该像下面这样枚举字典(这里有更详细的描述):

测试字典声明:

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的角度来看,上面的内容要优雅得多。

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返回值的正确方法是<<em>可选的绑定/em>:

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

(当然,桥接NSDictionary到Swift Dictionary,然后使用Swift枚举方法,如

最新更新