gpt4 book ai didi

swift - 柯里化(Currying)所有 swift 函数参数,但不调用该函数

转载 作者:行者123 更新时间:2023-11-28 09:34:54 25 4
gpt4 key购买 nike

我有以下快速功能:

func foo(bar: String)(_ baz: String) {
NSLog("bar \(bar), baz: \(baz)")
}

let f = foo("fizz")("buzz") // won't compile, foo returns Void

我想将其传递给 dispatch_async,但我不能,因为我无法在不调用该函数的情况下对两个参数进行柯里化(Currying)。如何在不调用 foo 的情况下同时 curry barbaz

最佳答案

如果您随意更改函数声明,Heath's answer是正确的。如果你不想这样做,那么你只需要使用内联闭包,例如

// pre-existing foo definition
func foo(bar: String)(_ baz: String) {
NSLog("bar \(bar), baz: \(baz)")
}

let f = { foo("fizz")("buzz") }
f()

如果您的问题是您想立即评估参数,您可以使用捕获列表:

let f = { [a=bar(),b=baz()] in foo(a)(b) }

或者当写成对 dispatch_async 的调用时:

dispatch_async(queue) { [a=bar(),b=baz()] in
foo(a)(b)
}

这是有效的,因为调用者在创建闭包时立即评估捕获列表(而不是在调用闭包时评估)。

另一种选择是定义一个嵌套的柯里化(Currying)函数。嵌套函数实际上只是闭包的糖,但它们可以更方便:

/// Function that your code is executing in
func myFunc() {
// ...

// define a nested function
func f(bar: String, baz: String)() {
foo(bar)(baz)
}

// now call it
dispatch_async(dispatch_get_main_queue(), f("foo", "bar"))
}

附录:我强烈建议不要说 NSLog("bar\(bar), baz:\(baz)")NSLog 采用格式字符串和参数,因此如果 barbaz 包含任何看起来像格式标记的内容(例如 % @%d) 那么对 NSLog() 的调用将表现不佳并可能崩溃。您有两个合理的选择:

  1. NSLog("%@", "bar\(bar), baz:\(baz)")
  2. NSLog("bar %@, baz: %@", bar, baz)

最佳选择取决于您的参数是否已与 CVarArg 兼容(String 兼容,但例如 String? 不兼容)。另请注意,如果保证您的参数不包含格式标记,例如它们是数字或 bool 值,那么您可以继续使用现有的 NSLog("bar\(someIntVar) baz\(someBoolVar)") 样式。

关于swift - 柯里化(Currying)所有 swift 函数参数,但不调用该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29398263/

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