Добавьте [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()

Другие вопросы по тегам