首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NSDictionary上循环使用with

在NSDictionary上循环使用with
EN

Stack Overflow用户
提问于 2015-10-07 16:09:02
回答 2查看 6K关注 0票数 2

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

代码语言:javascript
复制
id object = nil;
NSEnumerator *enumerator = ...;
while ((object = [enumerator nextObject])) {...}

不能用Swift翻译成这样:

代码语言:javascript
复制
var key:AnyObject!
let enumerator:NSEnumerator = myNSDictionary.keyEnumerator()    
while ( (object = enumerator.nextObject()) ) {...}

我有一个错误:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-07 17:36:29

object中, [enumerator nextObject]返回一个对象指针,当所有对象都被枚举时,该指针为nil,并返回赋值。

代码语言:javascript
复制
object = [enumerator nextObject]

等于指定的值。在……里面

代码语言:javascript
复制
while ((object = [enumerator nextObject])) { ... }

只要表达式比较不等于0,就会执行while块,在这种情况下,0是空指针常量,通常被写入为NULL,或者是对象-C指针的nil。所以这个循环等价于

代码语言:javascript
复制
while ((object = [enumerator nextObject]) != nil) { ... }

因此,在Swift中,赋值没有值(它是Void)

代码语言:javascript
复制
while ( (object = enumerator.nextObject()) )

不编译。您可以强制将其强制转换到BooleanType以使其编译,但这将在运行时崩溃。

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

代码语言:javascript
复制
let enumerator = myNSDictionary.keyEnumerator()
while let key = enumerator.nextObject() {
    print(key)
}

(当然,将NSDictionary连接到Swift Dictionary,然后使用Swift枚举方法(正如另一个答案所建议的那样)是一种明智的选择。

票数 6
EN

Stack Overflow用户

发布于 2015-10-07 16:13:03

您应该按以下方式对字典进行枚举(更详细地介绍了here ):

测试字典声明:

代码语言:javascript
复制
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]

枚举键和值:

代码语言:javascript
复制
for (airportCode, airportName) in airports {
    print("\(airportCode): \(airportName)")
}
// YYZ: Toronto Pearson
// LHR: London Heathrow

只枚举键:

代码语言:javascript
复制
for airportCode in airports.keys {
    print("Airport code: \(airportCode)")
}
// Airport code: YYZ
// Airport code: LHR

仅枚举值:

代码语言:javascript
复制
for airportName in airports.values {
    print("Airport name: \(airportName)")
}
// Airport name: Toronto Pearson
// Airport name: London Heathrow

也许您选择使用NSEnumerator有一个更深层次的原因,但如果不是这样的话,从Swift的角度来看,更多的是优雅的。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32997258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档