2016-08-10 9 views
2

ジェネリック関数のクロージャに述語を渡している間に、私はエラーが発生します。どうすればこの問題を解決できますか?この場合、クロージャーで述部を正しく渡すにはどうすればよいですか?

func find <T: IteratorProtocol> (generator : T, predicate: (T.Element) -> Bool) -> T.Element? { 
var gen = generator 
while let x = gen.next() { 
    if predicate(x) { 
     return x 
    } 
    } 
    return nil 
} 

var nums:[Int] = [2,3,5,6] 

エラー:は型の値に変換することはできません、私は次のように閉鎖を変更する場合 - - '>ブール(_')

let get = find(generator: nums){ (x:Int) -> Bool in 
    return x <= 4 
} 

予想引数の型に '(INT)>ブール' を、エラーは私がいる場合

let get = find(generator: nums) { 
    $0 <= 4 
} 

'< =' 演算子の あいまいな使用であり、値をIntにキャストするエラー:ジェネリックパラメータ 'T'を推論できませんでした。

let get = find(generator: nums) { 
    let b = $0 as Int 
    return b <= 4 
} 
+0

'nums'宣言を提示してください – fnc12

答えて

3

あなたfind関数は、引数、ないシーケンスとしてイテレータをとります。アレイ はSequenceに適合しますが、IteratorTypeには適合しません。だからあなたの述語は は正しいですが、あなたは最初 引数としてシーケンスイテレータを渡す必要があり:

let get = find(generator: nums.makeIterator()) { (x:Int) -> Bool in 
    return x <= 4 
} 

または

let get = find(generator: nums.makeIterator()) { 
    $0 <= 4 
} 

またはSequence引数を取るためにあなたの関数を変更します。

しかし、あなたはスウィフト3で導入された既存の first(where:)方法で同じ結果を得ることに注意してください:

if let y = nums.first(where: { $0 <= 4 }) { 
    print(y) 
} 
関連する問題