gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:58:52 24 4
gpt4 key购买 nike

在通用函数的闭包中传递谓词时,出现以下错误。我该如何解决这个问题。

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 参数。

但请注意,您使用现有的方法获得相同的结果first(where:) 方法在 Swift 3 中引入:

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

关于swift - 在这种情况下如何在闭包中正确传递谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38880755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com