我不明白为什么这篇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'
答案 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枚举方法,如中所示
其他答案,是一个明智的选择。)