循环通过 [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?没有名为“下标”的成员

[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误

[任何对象]?没有名为“下标”的成员

任何对象?没有名为“下标”的成员 swift

保存 Matlab 对象实例会导致无限循环

从 AnyObject 访问值时生成异常