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

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

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

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

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

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

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

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

+3
источник поделиться
1 ответ

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

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

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

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

+3
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по меткам или Задайте вопрос