在我的项目中,尝试将捕获列表与闭包一起使用,但是我注入了隐式解包的依赖项,因为我保证将通过依赖项注入来填充它们。我发现使用捕获列表会导致编译错误。
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
}
这是错误:
我可以通过在闭包内部强制展开来解决此问题,但令我惊讶的是,考虑到隐式展开的声明,这是必需的。为什么需要此步骤?这是错误还是功能?
答案 0 :(得分:1)
您可以声明隐式展开,但不能传播它。实际上不存在隐式展开的Optional类型,因此当您传递或分配或捕获声明为该类型的值时,它将恢复为常规的Optional。例如:
var forced: String! = "test"
let x = forced
您会发现x
是普通的Optional,String?
。您获得的价值就是这样。