(Pred) -> Pred { return { q in AN-6ren">
gpt4 book ai didi

swift - 如何修复 : "passing non-escaping parameter to function expecting @escaping closure"

转载 作者:行者123 更新时间:2023-11-28 06:29:17 24 4
gpt4 key购买 nike

我正在尝试将闭包用于一阶谓词演算,并且我打算定义以下函数:

func ASSUM<U, V>(p: @escaping Pred<U>) -> (Pred<U>) -> Pred<(U, V)> {
return { q in AND1(p: p, q: q) }
}

将谓词作为参数 p: Pred<U> , 其中Pred<U>(T) -> Bool 的类型别名:

typealias Pred<T> = (T) -> Bool

返回ASSUM(Pred<U>)->Pred<(U,V)> 类型的 Predicate 转换器闭包.

但是编译器返回以下错误:

Passing non-escaping parameter 'q' to function expecting an @escaping closure

我理解函数 AND1按照定义请求转义参数:

func AND1<U, V>(p: @escaping Pred<U>, q: @escaping Pred<V>) -> Pred<(U, V)> {
return { (x, y) in (p(x) && q(y)) }
}

但我没有成功明确地制作q{ q in AND1(p: p, q: q) }逃跑。

我该如何解决这个问题?

最佳答案

您必须明确地将 @escaping 属性添加到 ASSUM 的返回类型闭包的参数中:

typealias Pred<T> = (T)->Bool

func AND1<U, V>(p: @escaping Pred<U> , q: @escaping Pred<V>) -> Pred<(U, V)> {
return { (x,y) in (p(x) && q(y)) }
}

func ASSUM<U, V>(p: @escaping Pred<U>) -> (@escaping Pred<V>) -> Pred<(U, V)> {
/* ^ note: I believe you
want V here, not U */
return { AND1(p: p, q: $0) }
}

在返回的闭包中,q(匿名 $0 参数)被正确推断为 @escaping(并且不需要显式标记为如@Hamish 所指出的那样,谢谢!)。

另请注意,ASSUM 中的泛型类型 V 必须由显式类型注释(或转换)由调用者 推断,因为它不包含在 ASSUM 的任何参数中。

/* example usage */
let foo = { $0 < 2 }
let bar = { $0 != "bar" }

let fooAnd: (@escaping Pred<String>) -> Pred<(Int, String)> = ASSUM(p: foo)
let fooAndBar = fooAnd(bar)

print(fooAndBar((1, "foo"))) // true
print(fooAndBar((1, "bar"))) // false
print(fooAndBar((2, "foo"))) // false

最后,ALLCAPITAL 函数名称不符合 Swift 命名约定:您应该更喜欢 camelCase 命名(例如,请参阅 Swift API guidelines 了解更多详细信息)。

关于swift - 如何修复 : "passing non-escaping parameter to function expecting @escaping closure",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40844862/

24 4 0