我不明白为什么这段Objective代码:
id object = nil;
NSEnumerator *enumerator = ...;
while ((object = [enumerator nextObject])) {...}不能用Swift翻译成这样:
var key:AnyObject!
let enumerator:NSEnumerator = myNSDictionary.keyEnumerator()
while ( (object = enumerator.nextObject()) ) {...}我有一个错误:
类型'()‘不符合'BooleanType’协议
发布于 2015-10-07 17:36:29
在 object中, [enumerator nextObject]返回一个对象指针,当所有对象都被枚举时,该指针为nil,并返回赋值。
object = [enumerator nextObject]等于指定的值。在……里面
while ((object = [enumerator nextObject])) { ... }只要表达式比较不等于0,就会执行while块,在这种情况下,0是空指针常量,通常被写入为NULL,或者是对象-C指针的nil。所以这个循环等价于
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枚举方法(正如另一个答案所建议的那样)是一种明智的选择。
发布于 2015-10-07 16:13:03
您应该按以下方式对字典进行枚举(更详细地介绍了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的角度来看,更多的是优雅的。
https://stackoverflow.com/questions/32997258
复制相似问题