如何使用AnyObject.filter方法?

How can use the AnyObject.filter method?

我尝试使用 AnyObject.filter 方法,但是返回了以下错误:

Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored.

这是我的代码:

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 示例中我观察到可以使用闭包(带有整数数组的示例)。

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

首先,AnyObject 没有 filter 方法。该方法在 SequenceType 上。

你的代码有很多问题;我们将介绍它们。

return devices.filter() {

虽然这在技术上可行,但您不希望此处出现 ()。它只会造成混乱。你的意思是:

return devices.filter {

您的下一个问题是您引用了未声明的 device。您可能打算将 device in 添加到闭包中。或者,您可以将元素引用为 [=19=].

最后,您的闭包在 false 情况下没有 return 任何东西。你总是需要return一些东西。

您可以将所有这些简化为:

return devices.filter { 
    [=12=].hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo)
}