2016-03-27 16 views
0

は、しかし私は、次のエラーが返され、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 
     } 
    } 

} 

IはANYOBJECTしかし私はクロージャ(整数のアレイを有する例)を使用することが可能である観察スウィフト例では、パラメータとして述語を受け入れることを観察しました。

答えて

3

まず、AnyObjectfilter方法を持っていません。その方法はSequenceTypeです。

コードには多くの問題があります。私たちはそれらを歩き回ります。

return devices.filter() { 

これは技術的には機能しますが、ここでは()は不要です。ただ混乱を招くだけです。あなたはこのことを意味:

return devices.filter { 

あなたの次の問題は、あなたが宣言していないdeviceを参照してくださいということです。あなたはおそらくdevice inをクロージャーに追加するつもりでした。または、要素を$0と参照することもできます。

最後に、クロージャは偽の場合は何も返しません。あなたはいつも何かを返さなければなりません。あなたのソリューションのための

return devices.filter { 
    $0.hasMediaType(type == "audio" ? AVMediaTypeAudio : AVMediaTypeVideo) 
} 
+0

ありがとうございます。今、私はフィルタとソート方法がSwiftとどのように機能するのか理解しています。あなたは魅力のように働き、とてもシンプルです(ただ一つの行)。 –

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

ありがとう:

あなたはこのすべてを簡素化することができます。代わりの解決法があるのは良いことです。私はデバイスがスコープ内の配列要素のように機能するのを見ることができます。あなたのソリューションと最初のもののおかげで、私はフィルタメソッドがSwiftとどのように機能するかについてよく理解しています。 –