swift 4.2 Невозможно преобразовать значение типа '(_) -> Void' в ожидаемый тип аргумента '(() -> Void)?'
==> Версия Swift 3 в идеальной работе, но теперь работают Swift 4 и Swift 4.2.
static func animate(_ duration: TimeInterval,
animations: (() -> Void)!,
delay: TimeInterval = 0,
options: UIViewAnimationOptions = [],
withComplection completion: (() -> Void)! = {}) {
UIView.animate(
withDuration: duration,
delay: delay,
options: options,
animations: {
animations()
}, completion: { finished in
completion()
})
}
static func animateWithRepeatition(_ duration: TimeInterval,
animations: (() -> Void)!,
delay: TimeInterval = 0,
options: UIViewAnimationOptions = [],
withComplection completion: (() -> Void)! = {}) {
var optionsWithRepeatition = options
optionsWithRepeatition.insert([.autoreverse, .repeat])
self.animate(
duration,
animations: {
animations()
},
delay: delay,
options: optionsWithRepeatition,
withComplection: { finished in
completion()
})
}
Ошибка отображения на xcode =>
Не удается преобразовать значение типа '(_) -> Void' в ожидаемый тип аргумента '(() -> Void)?'
3 ответа
Вы объявили animate
функция такова, что его completion
Параметр не имеет входных аргументов. Тем не менее, вы пытаетесь вызвать входной аргумент, finished
в вашем закрытии, когда вы вызываете эту функцию в animateWithRepetition
, Просто удали finished
и ваш код компилируется нормально.
static func animateWithRepetition(_ duration: TimeInterval, animations: (() -> Void)!, delay: TimeInterval = 0, options: UIView.AnimationOptions = [], withComplection completion: (() -> Void)! = {}) {
var optionsWithRepetition = options
optionsWithRepeatition.insert([.autoreverse, .repeat])
self.animate(duration, animations: {
animations()
}, delay: delay, options: optionsWithRepeatition, withCompletion: {
completion()
})
}
PS: я исправил опечатки в именах ваших входных аргументов. Передача входного аргумента неявно развернутого типа также не имеет большого смысла. Либо сделать animations
нормальный Optional
и безопасно развернуть его или, вернее, сделать егоOptional
если это никогда не должно быть nil
,
В вашей функции декларация:
static func animate(_ duration: TimeInterval,
animations: (() -> Void)!,
delay: TimeInterval = 0,
options: UIViewAnimationOptions = [],
withComplection completion: (() -> Void)! = {})
вы определили обработчик завершения как (() -> Void)!
то есть не имеет никаких параметров.
Но когда вы вызываете эту функцию:
self.animate(
duration,
animations: {
animations()
},
delay: delay,
options: optionsWithRepeatition,
withComplection: { finished in
completion()
})
вы даете параметр finished
в завершении блока. Вот почему это дает ошибку.
Предполагается, что компилятор Swift4() -> Void
как(Void) -> Void
но так как это имеет значение, есть ли аргумент (даже если это Void)