У меня есть функция, которую я использовал в своем коде, но мне нужно передать ей обработчик завершения (чтобы я мог выйти из 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
), даже если я не даю никаких переменных. Заранее спасибо.
MockRecordable
в качестве первого параметра. Может быть, вам стоит развернуть это? - person Rob   schedule 06.08.2016