Как добиться такого же поведения, как при сидении в Swift?

У меня есть закрытие со слабым "я", мне нужно убедиться, что "я" будет сохранено во время выполнения закрытия и выпущено после закрытия после выполнения. Раньше это выполнялось командой @strongify. Есть ли другие способы сделать это в Swift?

Ответы

Ответ 1

В то время как другие ответы работают, другой вариант заключается в использовании обратных ссылок. Это позволяет отказаться от определения strongSelf и разрешить использование self без необходимости разворачивания опционального пользователя.

let c: () -> Void = {
    [weak self] in
    guard let `self` = self else { 
        throw NSError(domain: "self was destroyed", code: 1, userInfo: nil) 
    }
    self.doSomethingNonOptionalSelf()  
}

Ответ 2

Используйте локальную переменную, чтобы установить сильную ссылку на self.

let c: () -> Void = {
        [weak self] in
        // assign unwrapped optional to another variable
        guard let strongSelf: TypeOfSelf = self  else {
            return // or throw an exception, up to you
        }
        strongSelf.doSomething()
}

Ответ 3

Отвечая на старый вопрос о том, как поднять идиому, я не видел, чтобы многие поднимали этот вопрос: вы можете использовать withExtendedLifetime чтобы гарантировать, что ослабленное self не исчезнет на вас.

let c: () -> Void = {
        [weak self] in
        withExtendedLifetime(self) {
            self!.doSomething()
        }
}

Обратите внимание, что хотя withExtendedLifetime гарантирует, что аргумент не будет уничтожен до завершения вызова его закрытия, этот аргумент по-прежнему является необязательным, поэтому его необходимо развернуть.

Рекомендации:

  1. Стандартные библиотечные функции Swift
  2. Слабый/сильный танец в Swift