为什么必须对隐式解包变量的捕获对象引用进行解包?
Why does captured object reference to implicitly unwrapped variable have to be unwrapped?
在我的项目中,尝试使用带闭包的捕获列表,但我注入了隐式解包的依赖项,因为我保证它们将由依赖项注入填充。我发现使用捕获列表会导致编译错误。
var forced: String!
func example() {
escapingClosure { [forced] in
let new = forced + "something" //has to be unwrapped again despite being forced
print(new)
}
}
func escapingClosure(closurce: @escaping () -> ()) {
//do something
}
这里是错误:
我可以通过在闭包内强制解包来解决这个问题,但令我惊讶的是,鉴于隐式解包声明,这是必要的。为什么这一步是必要的?这是错误还是功能?
您可以声明隐式解包,但不能传播它。实际上不存在隐式展开的 Optional 类型,因此当您传递、分配或捕获声明为该类型的值时,它会恢复为普通的 Optional。例如:
var forced: String! = "test"
let x = forced
你会发现x
是一个普通的Optional,一个String?
。您捕获的值就是这样。
在我的项目中,尝试使用带闭包的捕获列表,但我注入了隐式解包的依赖项,因为我保证它们将由依赖项注入填充。我发现使用捕获列表会导致编译错误。
var forced: String!
func example() {
escapingClosure { [forced] in
let new = forced + "something" //has to be unwrapped again despite being forced
print(new)
}
}
func escapingClosure(closurce: @escaping () -> ()) {
//do something
}
这里是错误:
我可以通过在闭包内强制解包来解决这个问题,但令我惊讶的是,鉴于隐式解包声明,这是必要的。为什么这一步是必要的?这是错误还是功能?
您可以声明隐式解包,但不能传播它。实际上不存在隐式展开的 Optional 类型,因此当您传递、分配或捕获声明为该类型的值时,它会恢复为普通的 Optional。例如:
var forced: String! = "test"
let x = forced
你会发现x
是一个普通的Optional,一个String?
。您捕获的值就是这样。