循环通过[AnyObject]?结果没有名为generator的成员

Mik*_*ika 26 swift

为什么你不能[AnyObject]?直接循环?什么意思没有命名的发电机?循环一种[AnyObject]?类型的正确技术是什么?

这段代码给我一个错误,告诉我它没有名为generator的成员.

for screen in NSScreen.screens() {
        var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*nio 53

screens 返回一个可选项,因此在使用实际值之前必须打开 - 推荐的方法是可选绑定:

if let screens = NSScreen.screens() {
    for screen in screens {
        var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读更多关于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)
    }
}
Run Code Online (Sandbox Code Playgroud)

附录对评论中的问题的回答:为什么错误信息说[AnyObject]? does not have a member named generator

可选的类型与它包含的值不同(可选实际上是枚举).您可以迭代数组,但不能迭代整数或枚举.

为了理解差异,让我举一个现实生活中的例子:你在ebay上买了一台新电视,包裹发给你,你要做的第一件事是检查包裹(可选)是否为空(零).一旦你确认电视在里面,你必须打开它,把盒子放在一边.您不能在包装中使用电视.类似地,可选是一个容器:它不是它包含的值,并且它没有相同的类型.它可以为空,也可以包含有效值.


use*_*197 15

这是一个替代方案,可以为您节省一个级别的缩进:

for screen in NSScreen.screens() ?? []  {
    var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)  
}
Run Code Online (Sandbox Code Playgroud)

使用nil-coalescing运算符(??)在nil的情况下提供一个空数组,Swift将screens()视为非可选的.