Как добиться такого же поведения, как при сидении в 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
гарантирует, что аргумент не будет уничтожен до завершения вызова его закрытия, этот аргумент по-прежнему является необязательным, поэтому его необходимо развернуть.
Рекомендации:
- Стандартные библиотечные функции Swift
- Слабый/сильный танец в Swift