Swift 3 не может преобразовать аргумент типа .. в ожидаемый тип аргумента inout _

Он только что преобразовал мой небольшой проект Swift в Swift 3.

Вот ошибка компилятора, которую я не понимаю:

var onLoadedClosures: [() -> ()] = []
open func onLoaded(closure: () -> ()) {
    onLoadedClosures += [closure]
}

Невозможно преобразовать значение типа '[() -> ()]' в ожидаемый тип аргумента 'inout _'.

Я добавил ключевое слово inout:

    open func onLoaded(closure: inout () -> ()) {
        onLoadedClosures += [closure]
    }

Тогда это работает. Но почему для добавления элемента в массив требуется ключевое слово inout? Хотя я знаю, что означает inout.


person NathanVss    schedule 04.10.2016    source источник


Ответы (1)


Это запутанное сообщение об ошибке — проблема в том, что вам нужно пометить параметр closure: как @escaping, чтобы позволить ему избежать времени жизни функции onLoaded(closure:) (согласно SE-0103, аргументы функции замыкания теперь не экранируются по умолчанию).

var onLoadedClosures: [() -> ()] = []
open func onLoaded(closure: @escaping () -> ()) {
    onLoadedClosures += [closure]
}

Причина, по которой это работает, когда вы помечаете параметр как inout, заключается в том, что замыкания inout экранируются по определению (поскольку их значение записывается обратно вызывающей стороне при выходе из функции). Однако в этом случае просто нет необходимости в параметре inout.

Для получения дополнительной информации о @escaping см. Предложение быстрого развития по изменению, а также эти соответствующие вопросы и ответы.

person Hamish    schedule 04.10.2016