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

时间:2014-11-10 20:44:31

标签: swift

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

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

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

2 个答案:

答案 0 :(得分:53)

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上买了一台新电视,包裹发给你,你要做的第一件事是检查包裹(可选)是否为空(零) )。一旦你确认电视在里面,你必须打开它,把盒子放在一边。您不能在包装中使用电视。 类似地,可选是一个容器:它包含的值,并且它没有相同的类型。它可以为空,也可以包含有效值。

答案 1 :(得分:15)

这是一种可以节省一级缩进的替代方法:

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

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