2015-02-20 2 views
2

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

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

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

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

Неужели кто-нибудь сталкивался с такой вещью? Может быть, это ошибка Swift или Flurry?

+1

У Swift есть ужасная отчетность об ошибках, но он может попытаться вывести тип возврата из одного замыкания строки. Проверьте возвращаемый тип logEvent, чтобы убедиться, что он недействителен, поскольку (я предполагаю) UIAlertView ожидает закрытия, возвращающего Void. Ваша точка остается, хотя, об ошибке, вводящей в заблуждение. Обычный способ исправить это (если моя предпосылка верна), заключается в том, чтобы добавить один возврат строки в последнюю строку. –

+0

Ничего себе, даже не мог подумать об этом ... Но возвращаемый тип logEvent действительно не пусто. Таким образом, возврат одной строки (без возврата любого действительного значения) работает очень хорошо. Большое спасибо! –

ответ

0

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

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

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

func foo() -> Int { 
    return 1 
} 

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

bar({ foo() }) 

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

+0

Спасибо за подробное объяснение! –

Смежные вопросы