0

在我的项目中,尝试使用带有闭包的捕获列表,但我注入了隐式解包的依赖项,因为我保证它们将通过依赖项注入填充。我发现使用捕获列表会导致编译错误。

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
}

这是错误:

在此处输入图像描述

我可以通过在闭包内强制展开来解决这个问题,但我很惊讶考虑到隐式展开声明,这是必要的。为什么这一步是必要的?这是错误还是功能?

4

1 回答 1

2

您可以声明隐式展开,但不能传播它。实际上不存在隐式展开的 Optional 类型,因此当您传递或分配或捕获声明为该类型的值时,它会恢复为普通的 Optional。例如:

 var forced: String! = "test"
 let x = forced

你会发现那x是一个普通的 Optional,一个String?. 你捕获的价值就是这样。

于 2018-10-18T13:05:37.913 回答