Как сделать слабый указатель на себя быстрым вне блока
Я хочу сделать слабый указатель на себя быстрым, как мы привыкли в objective-c, например
__weak Something *weakself = self;
Я нашел людей, объясняющих, как использовать "слабый я" внутри блока,
{ in [unowned self] ...}
но я не хочу определять "слабый" внутри моего блока, я хочу определить слабую часть вне блоков
Ответы
Ответ 1
Просто определите слабую ссылку с ключевым словом weak
:
weak var weakSelf = self
Из documentation:
Вы указываете слабую ссылку, разместив ключевое слово weak
до объявление свойства или переменной.
...
ПРИМЕЧАНИЕ. Слабые ссылки должны быть объявлены как переменные, чтобы указать, что их значение может измениться во время выполнения. Слабая ссылка не может быть объявлена как константа.
Ответ 2
Мне кажется, что вы пытаетесь избежать цикла сохранения с блоком, подобным тому, который вы делаете в Objective-C, где вместо ссылки на self вы создаете слабую версию:
__weak MyType *weakSelf = self;
void (^aBlock)() = ^void()
{
[weakSelf doStuff];
}
Это не так, как Swift справляется с этой проблемой.
Вместо этого у него есть концепция списка захвата, которая сообщает компилятору, который ссылается на блокирование блока, и что с ним делать. Вы должны найти справочник Swift Programming для "Capture List" и прочитать его. Чтобы процитировать книгу:
"Если вы назначили закрытие свойства экземпляра класса и замыкание захватывает этот экземпляр, ссылаясь на экземпляр или его членов, вы создадите сильный опорный цикл между закрытием и экземпляр. Swift использует списки захвата, чтобы разбить эти сильные эталонные циклы. Для получения дополнительной информации см. Сильные ссылочные циклы для закрытий".
Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/us/jEUH0.l
Отредактировано 4 января 2016:
Чтобы процитировать часть книги Swift, в которой объясняется, как создать список захвата:
Определение списка захватов. Каждый элемент в списке захвата представляет собой сопряжение ключевое слово "слабая" или "незавершенное" с ссылкой на экземпляр класса (например, как self) или переменную, инициализированную некоторым значением (например, delegate = self.delegate!). Эти пары записываются в пределах пары квадратов скобки, разделенные запятыми.
Поместите список захвата до списка параметров закрытия и возврата если они предоставлены:
lazy var someClosure: (Int, String) -> String =
{
[unowned self, weak delegate = self.delegate!]
(index: Int, stringToProcess: String) -> String in
// closure body goes here
}
Отрывок из: Apple Inc. "Язык быстрого программирования (Swift 2)". интерактивные книги. https://itun.es/us/jEUH0.l