gpt4 book ai didi

swift - 不能对 Swift 中的闭包进行弱引用

转载 作者:IT王子 更新时间:2023-10-29 05:24:16 26 4
gpt4 key购买 nike

更新:我试着写了一下,没有弄弱,好像没有漏。所以也许这个问题不再是必要的。


在 Objective-C ARC 中,当你想让一个闭包能够在闭包内部使用它自己时,这个 block 不能捕获对它自己的强引用,否则它将是一个循环引用,所以你可以改为闭包捕获对自身的弱引用,如下所示:

// This is a simplified example, but there are real uses of recursive closures
int (^fib)(int);
__block __weak int (^weak_fib)(int);
weak_fib = fib = ^(int n) {
if (n < 2)
return n;
else
return weak_fib(n-1) + weak_fib(n-2);
};

我试着把它翻译成 Swift:

var fib: (Int -> Int)?
fib = { [weak fib] (n: Int) in // 'weak' cannot be applied to non-class type 'Int -> Int'
if n < 2 {
return n
} else {
return fib!(n-1) + fib!(n-2)
}
}

但是,Swift 编译器不允许我声明要弱捕获的函数('weak' 不能应用于非类类型 'Int -> Int')。 [unowned fib] 也不起作用('unowned' cannot be applied to non-class type '(Int -> Int)?')。

我知道函数不是 Swift 中的类类型。但是,它们是引用类型,并且它们确实参与引用计数。因此,是否应该有办法让它们成为弱引用或无主引用?

我如何在 Swift 中编写没有保留循环的递归闭包?

最佳答案

目前看来这是不可能的;你可能想要 file a bug .

但是您可以使用实际的函数来实现相同的目的:

func fib(n: Int) -> Int {
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}

fib(10) // 55

计算机科学的欢乐时光!为了更直接地翻译您的代码,我们可以使用 the Z combinator ,在 Swift 内置的柯里化(Currying)函数定义的帮助下:

func Z<T, U>(f: (T -> U, T) -> U)(x: T) -> U {
return f(Z(f), x)
}

let fib = Z { (fib: Int -> Int, n: Int) in
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}

fib(x: 10) // 55

// (Note the name 'x' should not be required here.
// It seems seems to be a bug in Beta 3, since the curried function in the
// Swift guide doesn't work as advertised either.)

关于swift - 不能对 Swift 中的闭包进行弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717460/

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