【问题标题】:Loop through [AnyObject]? results in does not have a member named generator循环通过 [AnyObject]?导致没有名为生成器的成员
【发布时间】: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)
}

【问题讨论】:

    标签: swift


    【解决方案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() ?? [] {,因为你不会真正迭代它。
    • 谢谢,那就更好了。出于某种原因,我认为[] 的类型会出错,也许是由于语言的变化?
    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多