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

时间:2018-10-18 12:52:36

标签: swift closures capture-list

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

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
}

这是错误:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

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

您会发现x是普通的Optional,String?。您获得的价值就是这样。