swift 4.2 Невозможно преобразовать значение типа '(_) -> Void' в ожидаемый тип аргумента '(() -> Void)?' - PullRequest
0 голосов
/ 29 января 2019

==> версия 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)?'

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы объявили функцию 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.

0 голосов
/ 29 января 2019

В объявлении вашей функции:

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 в блоке завершения.Вот почему это дает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...