循环通过 [AnyObject]?导致没有名为生成器的成员
Posted
技术标签:
【中文标题】循环通过 [AnyObject]?导致没有名为生成器的成员【英文标题】:Loop through [AnyObject]? results in does not have a member named generator 【发布时间】:2014-11-10 20:44:31 【问题描述】:为什么不能直接循环通过[AnyObject]?
?没有命名生成器是什么意思?循环遍历 [AnyObject]?
类型的正确技术是什么?
此代码给我一个错误,告诉我它没有名为生成器的成员。
for screen in NSScreen.screens()
var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
【问题讨论】:
【参考方案1】:screens
返回一个可选值,因此在使用实际值之前您必须解包 - 推荐的方法是可选绑定:
if let screens = NSScreen.screens()
for screen in screens
var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
阅读更多关于Optionals
注意NSScreen.screens
返回[AnyObject]?
,因此您可能希望在可选绑定中将数组转换为[NSScreen]
:
if let screens = NSScreen.screens() as? [NSScreen]
for screen in screens
var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
附录回答评论中的问题:为什么错误消息显示[AnyObject]? does not have a member named generator
可选项的类型与其包含的值不同(可选项实际上是枚举)。您可以迭代数组,但不能迭代整数或枚举。
为了理解区别,让我举一个现实生活中的例子:你在 ebay 上买了一台新电视,包裹寄给你,你要做的第一件事就是检查包裹(可选)是否为空(nil )。一旦你确认电视在里面,你必须打开它,把盒子放在一边。您不能在包装中使用电视。 类似地,可选项是一个容器:它不是它包含的值,并且它没有相同的类型。它可以为空,也可以包含有效值。
【讨论】:
好的,这显然是响应(将在 5 分钟后立即接受)。同时,您是否介意在您的回答中给我更多的色彩(教一个人钓鱼:)。我知道NSScreen.screens()
可能为零,所以我需要防止这种情况发生,但这意味着没有名为生成器的成员。另外,为什么我必须输入forScreen: screen as NSScreen
我们不是循环遍历 NSScreens 吗?
查看更新的答案。希望这个例子能让一切更清楚:)
超清晰!!!非常感谢...我将编辑问题,以便对更多人有所帮助。
所有可枚举类型,如数组、字典、集合、您自己的可枚举类型,都有一个名为“generator”的成员,它负责迭代。一个可选的没有。【参考方案2】:
这是一种替代方案,可以为您节省一层缩进:
for screen in NSScreen.screens() ?? []
var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
使用 nil-coalescing 运算符 (??) 在 nil 的情况下提供一个空数组,并且 Swift 将 screen() 视为非可选的。
【讨论】:
很好的提示,但我认为它可以更短:for screen in NSScreen.screens() ?? []
,因为你不会真正迭代它。
谢谢,那就更好了。出于某种原因,我认为[]
的类型会出错,也许是由于语言的变化?以上是关于循环通过 [AnyObject]?导致没有名为生成器的成员的主要内容,如果未能解决你的问题,请参考以下文章
斯威夫特:'(字符串)-> AnyObject?没有名为“下标”的成员