2015-05-26 2 views
0

У меня есть этот очень простой код для запуска таймера:не может вызывать scheduledTimer

var timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(2), target: self, selector: "timerDidFire:", userInfo: nil, repeats: true) 

Однако это дает мне:

Cannot invoke 'scheduledTimerWithTimeInterval' with an argument list of type '(Double, target: TestVC ->() -> TestVC, selector: String, userInfo: nil, repeats: Bool)' 

Который не имеет никакого смысла, мои типы аргументов точно соответствовать требуемые.

Вот определение функции:

scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer 

Что я делаю неправильно?

ответ

4

При использовании в выражении начальное значение для свойства

class TestVC : UIViewController (

     var timer = ... some expression using `self` ... 

     // ... 
} 

self является не экземпляр TestVC, а «кэрри функции» типа

TestVC ->() -> TestVC 

и там появляется странное сообщение об ошибке. Сам экземпляр не полностью инициализирован в этой точке. Это похоже на проблемы в ViewController.Type does not have a member named, и то же самое решение может быть применено здесь:

Объявляет переменную в качестве дополнительного (или неявно развернутом необязательно) и инициализировать его в каком-то методом, например, в viewDidLoad:

class TestVC: UIViewController { 

    var timer : NSTimer? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     timer = NSTimer.scheduledTimerWithTimeInterval(...) 
    } 

    // ... 
} 
1

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

Когда вы получаете ошибку компилятора, которая не имеет смысла, не забудьте перевести ее на «Что-то не так с этой строкой. Я понятия не имею, что, поэтому я собираюсь составить что-то совершенно не связанное и сообщить об этом».

Или просто "Derp?"

Мои деньги на вашем timerDidFire методе. Отправьте определение функции для этого метода.

Также класс, получающий методы NSTimer, должен быть классом Objective-C. Обычно это UIViewController, поэтому вам не нужно ничего особенного, поскольку все контроллеры представлений наследуются от NSObject.

0

это то, что работает для меня в Swift:

1) уаг updateTimer: NSTimer?

2) В viewDidLoad: updateTimer = NSTimer.scheduledTimerWithTimeInterval (Двойной (2), цель: самостоятельно, селектор: селектор ("updateB:"), UserInfo: ноль, повторяет: истинно)

3) func updateB (таймер: NSTimer!) { ...

Надеюсь, что это поможет ...

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