Swift — ошибка обработчика действия оповещения

У меня происходят странные вещи: попытка отследить, было ли отменено действие общего доступа в обработчике UIAlertAction с помощью FLurry Analytics SDK. Код должен в основном выглядеть так:

       let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
            (action:UIAlertAction!) -> Void in
            Flurry.logEvent("Share Cancelled")
            }
        )

Но компилятор показывает ошибку "Дополнительный аргумент "заголовок" в вызове..." и выделяет "Отмена" красным. Хотя, если я добавлю любое объявление переменной или простую функцию, такую ​​​​как println(), ошибки не будет! то есть этот код скомпилирован корректно и считается рабочим:

       let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel, handler: {
            (action:UIAlertAction!) -> Void in
            let somevar = 0
            Flurry.logEvent("Share Cancelled")
            }
        )

Кто-нибудь сталкивался с подобным? Может быть, это ошибка Swift или Flurry?


person Mike K    schedule 20.02.2015    source источник
comment
У Swift ужасные отчеты об ошибках, но он может пытаться вывести тип возвращаемого значения из замыкания одной строки. Проверьте возвращаемый тип logEvent, чтобы убедиться, что он недействителен, поскольку (я полагаю) UIAlertView ожидает закрытия, возвращающего Void. Тем не менее, ваша точка зрения остается в отношении вводящей в заблуждение ошибки. Обычный способ исправить это (если моя предпосылка верна) — добавить возврат одной строки в последнюю строку.   -  person Chris Conover    schedule 20.02.2015
comment
Вау, даже подумать не мог... Но возвращаемый тип logEvent действительно не пуст. Таким образом, возврат одной строки (без возвращаемого фактического значения) работает очень хорошо. Большое спасибо!   -  person Mike K    schedule 20.02.2015


Ответы (1)


Ради разрешения, из моего предыдущего комментария, Swift попытается вывести тип возвращаемого значения из замыкания с помощью одного оператора. Если вы пытаетесь определить замыкание с помощью одного оператора, который имеет возвращаемое значение, Swift будет считать, что это возвращаемое значение для вашего замыкания.

Поскольку вы заметили, что logEvent возвращает значение, вам нужно вообще ничего явно не возвращать, чтобы создать правильное замыкание.

Что бы это ни стоило, похоже, это было изменено/исправлено в 6.3, так как теперь выполняется следующий код:

func foo() -> Int {
    return 1
}

func bar(() -> ()) {
    println("Hello from bar")
}

bar({ foo() })

В общем, способ отладки неоднозначных ошибок, подобных этой, состоит в том, чтобы разбить оператор на несколько строк, явно определяя ожидаемые типы на каждом этапе, и смотреть, где он прерывается.

person Chris Conover    schedule 20.02.2015
comment
Спасибо за подробное объяснение! - person Mike K; 21.02.2015