Swift 是否有任何变通方法来指定内部func捕获列表&;他们的修饰语是斯威夫特

Swift 是否有任何变通方法来指定内部func捕获列表&;他们的修饰语是斯威夫特,swift,weak,capture-list,Swift,Weak,Capture List,我在内部func上搜索了swift规范中的捕获列表,但运气不好, 有没有办法打破这种参照循环 class你好{ var name=“name” 变量fn:(()->())?=nil } func foo()->喂?{ 变量栏:你好?=你好() func包装器()->()->(){ func内(){ 打印(“条:\(条)”) } 返回内部 } bar?.fn=wrapper() 回程杆 } var s=foo() var b=Hello() isKnownUniquelyReferenced(&s

我在内部func上搜索了swift规范中的捕获列表,但运气不好, 有没有办法打破这种参照循环

class你好{
var name=“name”
变量fn:(()->())?=nil
}
func foo()->喂?{
变量栏:你好?=你好()
func包装器()->()->(){
func内(){
打印(“条:\(条)”)
}
返回内部
}
bar?.fn=wrapper()
回程杆
}
var s=foo()
var b=Hello()
isKnownUniquelyReferenced(&s)//false
isKnownUniquelyReferenced(&b)//true

要使用捕获列表,必须使用匿名函数(许多人错误地称之为“闭包”)。那么,你会重写你的

    func inner() {
        print("bar: \(bar)")
    }
作为


如果您说
func
,则不会。将
内部
重写为匿名函数<代码>让内部:()->()={。现在您可以使用capture list.thx来快速回复@matt,虽然内部函数在实践中是一个罕见的用例,但我将把func声明中缺少capture list视为swift的一个错误,它打破了正交性。我同意,但按照我的建议,它很容易重写。另一个选项是将
重新绑定为
出嵌套函数的一侧,例如
弱var bar=bar;func-inner(){print(“bar:\(bar)”)}
。值得注意的是,通常情况下,捕获列表总是可以被捕获的闭包外的新变量替换。捕获列表的语法糖很好。@Hamish,但你不能这样做。而且你的技巧对顶级定义的func不起作用。在我看来,捕获列表它不仅仅是语法上的甜点;它是至关重要和独特的,OP有理由抱怨它只适用于匿名函数。
    let inner : () -> () = { [weak bar] in
        print("bar: \(bar)")
    }