Как можно использовать метод AnyObject.filter?

Я попытался использовать метод AnyObject.filter, однако возвращается следующая ошибка:

Контекстный тип для списка аргументов закрытия ожидает 1 аргумент, который нельзя неявно игнорировать.

Это мой код:

func listCaptureDevices(type: String?) -> [AnyObject]!
{

    // Initialize capture session
    let captureSession = AVCaptureSession()

    // List all capture devices
    captureSession.sessionPreset = AVCaptureSessionPresetLow
    let devices = AVCaptureDevice.devices()

    if type == nil
    {
        return devices
    }


    // Filter by device type
    return devices.filter() {
        if (device.hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo))
        {
            return true
        }
    }

}

Я заметил, что AnyObject принимает предикат как параметр, однако в примерах Swift я заметил, что можно использовать закрытие (примеры с массивом целых чисел).


person Juan Lago    schedule 27.03.2016    source источник


Ответы (2)


Во-первых, у AnyObject нет метода filter. Этот метод находится на SequenceType.

В вашем коде много проблем; мы пройдемся по ним.

return devices.filter() {

Хотя технически это работает, вам не нужен здесь (). Это просто создает путаницу. Вы имеете в виду это:

return devices.filter {

Ваша следующая проблема заключается в том, что вы ссылаетесь на device, который вы не объявляли. Вероятно, вы хотели добавить device in к вашему закрытию. В качестве альтернативы вы можете обратиться к элементу как $0.

Наконец, ваше закрытие ничего не возвращает в ложном случае. Всегда нужно что-то возвращать.

Вы можете упростить все это до:

return devices.filter { 
    $0.hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo)
}
person Rob Napier    schedule 27.03.2016
comment
Спасибо. Теперь я понимаю, как методы фильтрации и сортировки работают в Swift. Ваш пример работает как шарм, и он довольно прост (всего одна строка). - person Juan Lago; 27.03.2016

person    schedule
comment
Спасибо за ваше решение. Хорошо иметь альтернативное решение. Я вижу, что устройство работает как элемент массива в области видимости. Благодаря вашему решению и первому у меня есть хорошее понимание того, как метод фильтрации работает со Swift. - person Juan Lago; 27.03.2016