gpt4 book ai didi

swift - 如何处理闭包递归

转载 作者:IT王子 更新时间:2023-10-29 05:33:53 28 4
gpt4 key购买 nike

这是一个非常简单的递归函数:

func lap (n: Int) -> Int {
if n == 0 { return 0 }
return lap (n - 1)
}

如果我想将它转换为闭包:

let lap = {
(n: Int) -> Int in
if n == 0 { return 0 }
return lap (n - 1)
}

我收到一个编译器错误:“变量在它自己的初始值内使用”

最佳答案

你可以通过两步分配来解决这个问题

var lap : (Int) -> Int!
lap = {
(n: Int) -> Int in
if n == 0 { return 0 }
return lap(n - 1)
}

或者您可以使用 Y combinator

func Y<T, R>( f: (T -> R) -> (T -> R) ) -> (T -> R) {
return { t in f(Y(f))(t) }
}

let lap = Y {
(f : Int -> Int) -> (Int -> Int) in
return { (n : Int) -> Int in return n == 0 ? 0 : f(n - 1) }
}

// with type inference
let lap2 = Y {
f in { n in n == 0 ? 0 : f(n - 1) }
}

这是@zneak 发现的内存泄漏问题的解决方法(它没有内存泄漏但捕获了错误的值)

func f(n: Int) {
var f = Foo()
var lap: @objc_block (Int)->Int = { $0 }
var obj: NSObject = reinterpretCast(lap)
lap = {
[weak obj] (n: Int) -> Int in // unowned will cause crush
if n == 0 { return 0 }
println(f)
var lap2 : @objc_block (Int)->Int = reinterpretCast(obj)
return lap2 (n - 1)
}
lap(n)
}

for i in 0..<5 {
f(i)
}

class Foo {
init() {
println("init");
}

deinit {
println("deinit")
}
}

关于swift - 如何处理闭包递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25103534/

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