Опциональный параметр закрытия с быстрой скоростью 3

Данный:

typealias Action = () -> () var action: Action = { } func doStuff(stuff: String, completion: @escaping Action) { print(stuff) action = completion completion() } func doStuffAgain() { print("again") action() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() 

Есть ли способ сделать параметр completionaction ) типа Action? а также сохранить @escaping ?

Изменение типа дает следующую ошибку:

error: @escaping attribute only applies to function types

При @escaping атрибута @escaping код компилируется и запускается, но не кажется правильным, так как закрытие completion закрывая область действия функции.

Существует сообщение SR-2552 о том, что @escaping не распознает псевдоним типа функции. поэтому @escaping attribute only applies to function types error @escaping attribute only applies to function types . вы можете обходным путем путем расширения типа функции в сигнатуре функции:

 typealias Action = () -> () var action: Action? = { } func doStuff(stuff: String, completion: (@escaping ()->())?) { print(stuff) action = completion completion?() } func doStuffAgain() { print("again") action?() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() 

EDIT ::

Я был на самом деле под бета-версией xcode 8, где ошибка SR-2552 еще не была решена. исправляя эту ошибку, ввели новую (ту, с которой вы сталкиваетесь), которая все еще открыта. см. SR-2444 .

Обходной путь Майкл Ильзман указал, что временное решение – это удалить атрибут @escaping из необязательного типа функции, который удерживает функцию как экранирование .

 func doStuff(stuff: String, completion: Action?) {...} 

из: список рассылки быстрых пользователей

В принципе, @escaping действителен только при закрытии в позиции параметров функции. Правило noescape-by-default применяется только к этим замыканиям в позиции параметров функции, в противном случае они экранируются. Агрегаты, такие как enums со связанными значениями (например, необязательные), кортежи, структуры и т. Д., Если у них есть закрытие, следуют правилам по умолчанию для закрытий, которые не находятся в позиции параметров функции, т.е. они ускользают.

Таким образом, необязательным параметром функции является @escaping по умолчанию.
@noeascape по умолчанию применяется только к параметру функции.

Я получил его в Swift 3 без каких-либо предупреждений только таким образом:

 func doStuff(stuff: String, completion: (()->())? ) { print(stuff) action = completion completion?() } 

я сталкиваюсь с аналогичной проблемой, и потому что смешивание @escaping и non @ escaping очень сбивает с толку, особенно если вам нужно пройти закрытие. Я в конечном итоге с параметрами по умолчанию (что, я думаю, имеет больше смысла)

 func doStuff(stuff: String = "do stuff", completion: @escaping (_ some: String) -> Void = { _ in }) { completion(stuff) } doStuff(stuff: "bla") { stuff in print(stuff) } doStuff() { stuff in print(stuff) } 
  • Переопределить функцию, импортированную в пространстве имен
  • Когда имя массива или имя функции «преобразуется» в указатель? (в С)
  • Для чего используются указатели на функции и как их использовать?
  • Функция не меняет пройденный указатель C ++
  • R: 2 функции с тем же именем в двух разных пакетах
  • C-образный указатель на функцию void pointer
  • Как создать функцию шаблона внутри classа? (C ++)
  • Назначение конструктора в Java?
  • Объявлять переменные в верхней части функции или в отдельных областях?
  • c ++ -
  • Вызов метода с приемником указателя объектом вместо указателя на него?
  • Давайте будем гением компьютера.