2014-12-05 2 views
1

Я пытаюсь сделать очень простую задержку выскакивают к контроллеру вида корневой с этим кодом:dispatch_after error: '[AnyObject]?' не является подтипом «Пустота»

let delay = 1 * Double(NSEC_PER_SEC) 
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 
dispatch_after(time, dispatch_get_main_queue(), { 
    self.navigationController?.popToRootViewControllerAnimated(true) 
}) 

Но я получаю ошибку '[AnyObject]?' is not a subtype of 'Void' я предполагаю, что у него есть что-то делать с вызовом self.navigationController внутри блока/закрытия, потому что, если я прокомментирую эту строку и заменю на println("Will this compile"), она работает.

Может кто-нибудь объяснить, почему я получаю эту ошибку и какой правильный способ достичь того, что я пытаюсь сделать?

Xcode 6.1.1

спасибо.

+0

self.navigationController .popToRootViewControllerAnimated (истинный) возвращает [AnyOject] в качестве возвращаемого значения. Но dispatch_after() имеет тип возврата блока как Void, вот в чем проблема – Suresh

ответ

6

В быстрых замыканиях с одним оператором автоматически возвращается возвращаемое значение оператора. В вашем конкретном случае он пытается вернуть экземпляр [AnyObject]?, который является возвращаемым значением popToRootViewControllerAnimated. Закрытие ожидается dispatch_after вместо Void -> Void. Так как тип возврата закрытия не соответствует, компилятор жалуется на это.

Чтобы устранить эту проблему, просто добавьте явный оператор возврата:

dispatch_after(time, dispatch_get_main_queue(), { 
    self.navigationController?.popToRootViewControllerAnimated(true) 
    return 
    ^^^ 
}) 
+0

Ahhh okay, это имеет смысл. Когда я посмотрел на ошибку и тип, возвращаемые 'popToRootViewControllerAnimated', я увидел это, но думал, что ничего не возвращаю, поэтому не понял, почему я получаю эту ошибку. Каждый день - школьный день, спасибо Антонио – sbarow

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