为什么不能直接遍历[AnyObject]?
?什么意思没有命名的发电机?循环[AnyObject]?
类型的正确技巧是什么?
这段代码给我一个错误,告诉我它没有名为generator的成员。
for screen in NSScreen.screens() {
var result : Bool = workspace.setDesktopImageURL(imgurl, forScreen: screen, options: nil, error: &error)
}
答案 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()视为非可选。