我不明白为什么这段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枚举方法,如