在这种情况下如何在闭包中正确传递谓词?

时间:2016-08-10 18:16:01

标签: swift

在泛型函数的闭包中传递谓词时,我会遇到以下错误。我该怎么解决这个问题呢。

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
}

1 个答案:

答案 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)
}