Прохождение закрытия в Swift

У меня есть функция, которую я использовал в своем коде, но мне нужно передать ей обработчик завершения (чтобы я мог выйти из dispatch_group). Я не хотел, чтобы это повлияло на остальную часть моего кода, поэтому я попытался изменить пространство имен следующим образом:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase)

к этому:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (())? = nil)

Когда я перехожу к закрытию, вот так:

cloud.uploadRecordable(testRecordable, database: database) {
        dispatch_group_leave(forCloudToBeClearOfTestRecord)
    }

Я получаю эту ошибку:

Function produces expected type 'Void' (aka '()'); did you mean to call it with '()'?

Я думаю, что, поскольку аргумент completionHandler: (())? имеет значение по умолчанию nil, компилятор сбит с толку закрытием, но когда я попробовал это, я все еще получаю ту же ошибку:

    cloud.uploadRecordable(testRecordable, database: database, completionHandler: {
        dispatch_group_leave(forCloudToBeClearOfTestRecord)
    })

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

Любая помощь в том, что мне здесь не хватает?

-ИЗМЕНИТЬ-

После изменения аргумента закрытия на (() -> ())? я получаю эту ошибку:

Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() -> ())?)'

Первые два аргумента работали нормально, но мне все еще не нравится мое закрытие. Должен ли я помещать что-то в первую строку (например, var in), даже если я не даю никаких переменных. Заранее спасибо.


person Mercutio    schedule 06.08.2016    source источник
comment
Спасибо, сейчас попробую. Почему бы мне не хотеть, чтобы он вернул Пустоту, для собственного назидания?   -  person Mercutio    schedule 06.08.2016
comment
Я делаю последующую правку в ближайшее время.   -  person Mercutio    schedule 06.08.2016
comment
Что касается новой ошибки, вы передаете необязательный MockRecordable в качестве первого параметра. Может быть, вам стоит развернуть это?   -  person Rob    schedule 06.08.2016
comment
Вот оно! Я такой идиот. Если вы хотите опубликовать как ответ, я могу отметить это для вас. Спасибо @Роб   -  person Mercutio    schedule 06.08.2016


Ответы (1)


В объявлении функции вместо объявления параметра как completionHandler: (())? вам нужно completionHandler: (() -> Void)? или completionHandler: (() -> ())?.

Таким образом:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> Void)? = nil) { ... }

Or

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> ())? = nil) { ... }
person Rob    schedule 06.08.2016