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

标签 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]

错误:无法将“(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/

相关文章:

ios - TextView 点按在 iOS 14 上不起作用

swift - 在 NSView 中绘制 2 个图像

ios - Swift 如何在 watch 上显示 textStorage

ios - Firebase 查询不起作用

objective-c - 设置 serverCleintID 时,通过 google+ 进行身份验证失败

swift - Sprite Kit 随机位置

ios - UiStackView 内的 UiTextField 没有响应

swift - 主视图的高度在 viewController 之间发生变化。我应该如何保持它们相同?

ios - 无法使用类型为 'animateWithDuration' 的参数列表调用 '(...)'

swift - 将 Face ID 生物特征认证限制为 3