当前位置: 首页 > 知识库问答 >
问题:

如何修复:“将非转义参数传递给期望@escaping闭包的函数”

上官彬
2023-03-14

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

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

它将谓词< code>p: Pred作为参数

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

ASSUM返回是一个谓词转换器闭包类型 (Pred

然而,编译器返回以下错误:

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

我知道函数和1的定义要求一个转义参数:

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

但是我没有成功地在AND1(p: p, q: q)}中显式使q转义。

我怎样才能解决这个问题?

共有1个答案

汝跃
2023-03-14

您必须明确地将<code>转义</code>属性添加到<code>ASSUM</code>的返回类型闭包的参数中:

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 命名约定:您应该更喜欢驼峰大小写命名(有关其他详细信息,请参阅例如 Swift API 指南)。

 类似资料:
  • 问题内容: 我试图了解Go在创建带有参数的匿名函数与将该函数用作闭包之间的区别。这是区别的一个例子。 带参数: 作为关闭: 我的问题是,第一种形式何时比第二种更好?您是否会为此类事情使用参数?我唯一看到第一种形式有用的是从另一个函数返回a时。 问题答案: 使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。 在 Closure中, 所有函数调用都将使用中存储的

  • 我最近开始学习Swift,遇到了一个关于闭包的问题。我试图将开车的参数传递给func travel并收到错误消息:无法将类型'()'的值转换为预期的参数类型'()- 有人能善意地建议吗?赞赏!

  • 问题内容: 这似乎是一个愚蠢的问题,但是我是这个话题的新手。我正在致力于关于节点js的承诺。我想将参数传递给Promise函数。但是我不知道。 而功能类似于 问题答案: 将Promise包裹在一个函数中,否则它将立即开始工作。另外,您可以将参数传递给函数: 然后,使用它: ES6: 用:

  • 我有一个react组件,我想用不同的参数调用相同的箭头函数,但我被困在如何传递参数给它,现在我在问自己,我能做到吗?

  • 问题内容: 以下作品: 垃圾邮件 但是,如果拿来争论呢? TypeError:spam()恰好接受1个参数(给定0) 鉴于我无权访问函数本身,而只能访问代码对象,执行该函数时如何将参数传递给该代码对象?评估可能吗? 编辑:由于大多数读者倾向于不相信这样做的用处,请参见以下用例: 我想将小的Python函数保存到文件中,以便可以从其他计算机上调用它们。(在这里不必说这个用例会严重限制可能的功能。)腌

  • 问题内容: 我正在学习Python。希望有人指出我正确的方法。 这是我想在下面做的事情: 任何想法?提前致谢。 问题答案: 您不能将其作为自己的名称传递,但是可以将其添加到关键字中。 另外,您可以命名自己的参数: 类方法: