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)

Другие вопросы по тегам