gpt4 book ai didi

swift - 为什么捕获列表中的捕获说明符是可选的?

转载 作者:搜寻专家 更新时间:2023-10-31 21:57:16 25 4
gpt4 key购买 nike

Swift 中的捕获列表语法中似乎存在一个奇怪的语法故障。如果我声明了多个捕获变量,则捕获说明符仅适用于第一个变量:

let closure = { [unowned x, y] in … }

现在我希望 yunowned,但事实并非如此:

class Test {

var callback: (Void -> Void)?

init() {
print("init")
}

deinit {
print("deinit")
}
}

func makeScope() {
let x = Test()
let y = Test()
y.callback = { [unowned x, y] in
print(y)
}
}

makeScope()
print("done")

这打印:

init
init
deinit
done

所以 y 似乎被强捕获并创建了一个保留循环,防止对象被释放。是这样吗?如果是,在列表中允许“空”捕获说明符是否有意义?或者是否有原因 [unowned x, y] 未被视为 [unowned x, unowned y]

最佳答案

... does it make sense to permit an “empty” capture specifier in the list?

是的。捕获说明符(“weak”、“unowned”及其变体)只能与引用类型一起使用,但也有您希望捕获值类型的情况(这里是一个例子: Pass value to closure? ).

您可能还想捕获一个强引用类型。捕获引用类型确保引用(指针)本身由值捕获,如以下示例所示:

class MyClass {
let value : String
init(value : String) {
self.value = value
}
}

var ref = MyClass(value: "A")

let clo1: () -> Void = { print(ref.value) }
let clo2: () -> Void = { [ref] in print(ref.value) }

ref = MyClass(value: "B")

clo1() // Output: B
clo2() // Output: A

当第一个闭包执行时,闭包内的ref是对创建为 MyClass(value: "B") 的对象的引用。

第二个闭包捕获 ref 的值关闭被创建,并且当一个新值时这不会改变分配给 var ref

关于swift - 为什么捕获列表中的捕获说明符是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36406254/

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