在通用函数的闭包中传递谓词时,出现以下错误。我该如何解决这个问题。
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) -> Bool”类型的值转换为预期的参数类型“(_) -> Bool”
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
}
最佳答案
您的 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)
}
关于swift - 在这种情况下如何在闭包中正确传递谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38880755/