为什么必须对隐式解包变量的捕获对象引用进行解包?

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?。您捕获的值就是这样。