2015-01-10 2 views
1

Я создаю простой Metronome WatchApp. Я использую NSTimer с .scheduledTimerWithTimeInterval, и у меня есть сообщение об ошибке дополнительный аргумент «селектор» в вызовеSwift: дополнительный аргумент при вызове с плановымTimerWithTimeInterval

Спасибо за ваши ответы

func playBeat() { 

     if(self.State == true) { 
      self.State == false 
      [labelPlayPause.setTitle("Pause")] 
     } else { 
      self.State == true 
      [labelPlayPause.setTitle("Play")] 
     } 

     BPMValue = 10 
     var BPMInt:Int = Int(BPMValue) 
     let value = "\(BPMInt) BPM" 
     labelBPM.setText(value) 
     let aSelector: Selector = "playBeat" 

     dispatch_async(dispatch_get_main_queue(), { 
      NSTimer.scheduledTimerWithTimeInterval(60/self.BPMValue, target:self, selector: aSelector, userInfo:nil, repeats:false) 
     }) 

    } 

ответ

6

Это плохое сообщение об ошибке от Swift!

Это действительно означает, что вам необходимо обеспечить соответствие типов каждого параметра функции типам переданных значений.

В вашем случае, BPMValue является Float и scheduledTimerWithTimeInterval ожидает и NSTimeInterval в качестве первого параметра. Обратите внимание, что NSTimeInterval (Double) и Float не являются эквивалентными. В Objective-C вы получаете неявное преобразование, это не происходит в Swift.

Попробуйте

NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(60/self.BPMValue), target:self, selector: aSelector, userInfo:nil, repeats:false) 

В качестве примечания, вы можете быть немного более лаконична с кодом в Swift:

func playBeat() { 

    if State {   // If State is a Bool, you can lose the '== true' 
     State = false // Must use set not comparison operator. No need to refer to 'self'. 
     labelPlayPause.setTitle("Pause") 
    } else { 
     State = true // Must use set not comparison operator. 
     labelPlayPause.setTitle("Play") 
    } 

    BPMValue = 10 
    var BPMInt = Int(BPMValue) // Int Type is inferred 
    let value = "\(BPMInt) BPM" 
    labelBPM.setText(value) 
    let aSelector: Selector = "playBeat" 

    dispatch_async(dispatch_get_main_queue(), { 
     NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(60/self.BPMValue), target:self, selector: aSelector, userInfo:nil, repeats:false) 
    }) 

} 
+0

Я не unserstand. BPMValue не Int, а float. Я конвертирую BPMValue в Int для отображения в Label (BPMInt). Я использую в NSTimer BPMValue как float, нет? –

+0

Нет, NSTimeInterval - это типAlias ​​for Double, который не эквивалентен Float, поэтому вы не можете передать ему float. –

+0

Итак, вам нужно добавить либо Double, либо NSTimeInterval, но не Float. –

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