2016-08-10 40 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] 

錯誤:不能轉換類型的值 '(INT) - >布爾' 預期參數類型 '(_) - >布爾'

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

如果我改變的蓋,遵循中,錯誤是 曖昧使用操作者的 '< ='

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說法。

但請注意,您實現與現有 first(where:)方法斯威夫特3引入了相同的結果:

if let y = nums.first(where: { $0 <= 4 }) { 
    print(y) 
} 
相關問題