Понимание цели закрытия - PullRequest
       44

Понимание цели закрытия

0 голосов
/ 24 сентября 2019

Пытаясь понять быстрые замыкания

Я пытаюсь понять, как работают замыкания и когда их следует использовать.Есть несколько вещей, которые я не понимаю ...

  1. Как я знаю, как назвать мой тип возвращаемого значения?В моем примере ниже ... ни 'action', ни 'alertTextField' просто не возвращаются.

  2. Что нужно сделать внутри пробки?Почему это не может быть сделано просто в функции, чтобы люди, читающие код, могли видеть, что вызывается и где?(Вы можете сказать, что я просто не понимаю их потребности)

  3. Вы пытались научиться замыканиям?Как вы пришли к пониманию.Кто-то научил их вам так, чтобы это вызывало у вас в голове щелчок?

    @objc func addButtonPressed() {

        var textField = UITextField()

        let alertController = UIAlertController(title: "What do you need to do?", message: "", preferredStyle: .alert)

        let alert = UIAlertAction(title: "Add", style: .default) { (action) in
            self.itemArray.append(textField.text!)
            self.tableView.reloadData()
        }

        alertController.addTextField { (alertTextField) in
            textField = alertTextField
        }

        alertController.addAction(alert)
        present(alertController, animated: true, completion: nil)
    }

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Как узнать, как назвать мой тип возвращаемого значения?В моем примере ниже ... ни 'action', ни 'alertTextField' просто не возвращаются.

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

enter image description here

Что должно входить в замыкание?Почему это не может быть сделано просто в функции, чтобы люди, читающие код, могли видеть, что вызывается и где?(Вы можете сказать, что я просто не понимаю их потребности)

Внутри замыкания вы должны написать код, который делает что-то, например, когда нажимается действие оповещения (пользователь нажимает «ОК» или «Отмена») и уверен, что вы можете написатьфункцию и вызвать ее изнутри

Вы пытались научиться замыканиям?Как вы пришли к пониманию.Кто-то научил их вам так, чтобы это вызывало щелчок в вашей голове?

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

0 голосов
/ 24 сентября 2019

Вы можете смотреть на замыкания так же, как на функции.В Swift замыкания и функции имеют одинаковый тип.Но функции имеют имена и не захватывают переменные в области видимости.
Вы написали краткий синтаксис замыкания, в полном синтаксисе замыкание имеет список параметров, список захвата и возвращаемое значение.Полный синтаксис слишком многословен:

{ [weak self] (a : AClass) -> BClass in

  return BClass()
}

Вы можете опустить тип возвращаемого значения, типы параметров и список захвата, компилятор выведет его через контекст.
По умолчанию закрытие захватывает переменные с помощью сильных ссылок дляклассы и ссылки на структуры (вы можете изменить значение экземпляров структуры из замыкания).

var s = Struct()
let closure = {
  s.a = 5;
}
closure()

Об асинхронном вызове замыканий

Говорят, что замыкание экранирует функциюкогда замыкание передается в качестве аргумента функции, но вызывается после ее возврата.

Это означает, что замыкание будет иметь сильные ссылки для всех переменных, упомянутых в теле замыканий.Чтобы избежать сильных ссылок на self, я использую следующий трюк:

let closure = { [weak self] () -> Void in
 guard let self = self else {
  return
 }
 //do some work
}

Посмотрите на замыкания как на функции без имени или как на функтор (в терминах C ++), который создается компилятором, и все будет хорошо.

Здесь вы можете прочитать о синтаксисе замыканий.Также замыкания в swift аналогичны блокам в Objective-C и лямбдам в C ++.

...