0

我尝试使用 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 示例中,可以使用闭包(整数数组的示例)。

4

2 回答 2

3

首先,AnyObject没有filter方法。该方法已启用SequenceType

你的代码有很多问题;我们将遍历它们。

return devices.filter() {

虽然这在技术上有效,但您不想要()这里。它只会造成混乱。你是这个意思:

return devices.filter {

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

最后,您的闭包在错误情况下不会返回任何内容。你总是必须返回一些东西。

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

return devices.filter { 
    $0.hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo)
}
于 2016-03-27T19:21:39.490 回答
1
return devices.filter() {device in
    if (device.hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo))
    {
        return true
    }
    return false
}
于 2016-03-27T19:17:42.597 回答