Почему захваченная ссылка на объект на неявно развернутую переменную должна быть развернута?
В моем проекте я пытаюсь использовать списки захвата с замыканиями, но я внедрил зависимости, которые неявным образом развернуты, так как я гарантирую, что они будут заполнены внедрением зависимостей. Я обнаружил, что использование списка захвата привело к ошибке компиляции.
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
}
Вот ошибка:
Я могу решить эту проблему путем распаковки внутри замыкания, но я удивлен, что это необходимо, учитывая неявно развернутую декларацию. Почему этот шаг необходим? Это ошибка или особенность?
1 ответ
Вы можете объявить неявное развертывание, но вы не можете распространять его. На самом деле не существует такого понятия, как неявно развернутый необязательный тип, поэтому при передаче или присвоении или захвате значения, объявленного как этот тип, он возвращается к обычному необязательному типу. Например:
var forced: String! = "test"
let x = forced
Вы найдете это x
это обычная опция, String?
, Ваше захваченное значение таково.