Добавьте [unowned self] к аргументу закрытия Swift
У меня есть функция с обработчиком завершения, возвращающим один или несколько параметров.
В клиенте при выполнении обработчика завершения я хотел бы иметь unowned
ссылка на self
, а также доступ к параметру передан.
Вот пример игровой площадки, иллюстрирующий проблему и цель, которую я пытаюсь достичь.
import UIKit
struct Struct {
func function(completion: (String) -> ()) {
completion("Boom!")
}
func noArgumentsFunction(completion: () -> Void) {
completion()
}
}
class Class2 {
func execute() {
Struct().noArgumentsFunction { [unowned self] in
//...
}
Struct().function { (string) in // Need [unowned self] here
//...
}
}
}
2 ответа
Как я уже сказал в своем комментарии
Struct().function { [unowned self] (string) in
//your code here
}
Список захвата и параметры закрытия, которые должны быть в порядке закрытия, больше информации от Apple Documentation
Определение списка захвата
Каждый элемент в списке захвата представляет собой пару слабого или неизвестного ключевого слова со ссылкой на экземпляр класса (например, на себя) или на переменную, инициализированную некоторым значением (например, делегат = self.delegate!). Эти пары пишутся в виде пары квадратных скобок, разделенных запятыми.
Поместите список захвата перед списком параметров замыкания и типом возврата, если они предоставлены:
lazy var someClosure: (Int, String) -> String = {
[unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
// closure body goes here
}
Если в замыкании не указан список параметров или тип возвращаемых данных, поскольку они могут быть выведены из контекста, поместите список захвата в самое начало замыкания, а затем введите ключевое слово in:
lazy var someClosure: () -> String = {
[unowned self, weak delegate = self.delegate!] in
// closure body goes here
}
Это просто синтаксис для включения [unowned self] в список параметров замыкания, который вам нужен?
struct Struct {
func function(completion:(String)->()) {
completion("Boom!")
}
}
class Class {
func execute() {
Struct().function { [unowned self] string in
print(string)
print(self)
}
}
}
Class().execute()