Подтвердить что ты не робот

Пропустить через [AnyObject]? результаты не имеют члена с именем generator

Почему вы не можете напрямую прокручивать [AnyObject]?? Что это значит, что нет именованного генератора? Какова надлежащая техника для циклического перехода через тип [AnyObject]??

Этот код дает мне ошибку, говорящий мне, что у него нет члена с именем generator.

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

Ответ 1

screens возвращает необязательный параметр, поэтому перед использованием фактического значения, которое вы должны разворачивать - рекомендуемый метод является необязательным связыванием:

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

Подробнее о Опции

Обратите внимание, что 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, пакет отправлен вам, первое, что вы делаете, это проверить, пуст (необязательный) пакет (ноль). Как только вы убедитесь, что телевизор находится внутри, вы должны развернуть его и положить коробку в сторону. Вы не можете использовать телевизор, пока он находится в пакете. Аналогичным образом, необязательным является контейнер: это не значение, которое оно содержит, и оно не имеет одного и того же типа. Он может быть пустым или может содержать допустимое значение.

Ответ 2

Здесь альтернатива, которая сохранит вам один уровень отступов:

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

Использование оператора nil-coalescing (??) предоставляет пустой массив в случае nil, а Swift рассматривает экраны() как необязательные.