在泛型函数的闭包中传递谓词时,我会遇到以下错误。我该怎么解决这个问题呢。
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]
错误:无法转换类型&#39;(Int) - &gt;的值布尔&#39;预期参数类型&#39;(_) - &gt;布尔&#39;
let get = find(generator: nums){ (x:Int) -> Bool in
return x <= 4
}
如果我按如下方式更改闭包,错误就是 模糊地使用运算符&#;;&lt; =&#39;
let get = find(generator: nums) {
$0 <= 4
}
如果我将值转换为Int,错误:泛型参数&#39; T&#39;无法推断。
let get = find(generator: nums) {
let b = $0 as Int
return b <= 4
}
答案 0 :(得分: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
参数。
但请注意,您可以使用现有结果获得相同的结果
Swift 3中引入的first(where:)
方法:
if let y = nums.first(where: { $0 <= 4 } ) {
print(y)
}