【发布时间】:2021-02-03 20:52:10
【问题描述】:
我的问题源自以下日语问题。 这不是我的问题,但我正在尝试回答以下问题,但找不到合适的答案。
https://teratail.com/questions/298998
上面的问题将简化如下。
func executetwice(operation:() -> Void) {
print(operation)
operation()
}
本编译器需要在operation:标签后面加上@escaping关键字,如
func executetwice(operation: @escaping () -> Void) {
print(operation)
operation()
}
但实际上,operation 块似乎并没有从这个块中逃脱。
另一种方式,
func executetwice(operation:() -> Void) {
let f = operation as Any
operation()
}
编译器还需要添加@escaping 关键字。它只是向上转换到Any。
在其他情况下,只是转换为相同的类型,这似乎是错误的。
func executetwice(operation:() -> Void) {
let f = operation as () -> Void //Converting non-escaping value to '() -> Void' may allow it to escape
operation()
}
我不知道为什么我需要添加 @escaping 关键字,没有转义条件。
只需添加@escaping关键字就可以了,但我想知道为什么编译器在这种情况下需要关键字。
【问题讨论】: