Как использовать NSTimer для выключения несколько раз?

У меня есть ГСМ, и я хочу, чтобы он отключался каждые три секунды. Пока у меня есть

var timer = NSTimer(timeInterval: 3, target: self , selector: randomnumbers, userInfo: nil, repeats: true)

func randomnumbers() {
    var rockNamesArray:[String] = ["bird", "rock2", "rock3"]

    var rockpos = Int(arc4random_uniform(UInt32(3)))
}

Но у меня есть куча сообщений об ошибках, и я не уверен, как это организовать.

РЕДАКТИРОВАТЬ

Сообщение об ошибке в этом коде говорит мне, что у него есть неразрешенный идентификатор "self", и все остальные ошибки происходят только потому, что я изменил этот код, как неразрешенный идентификатор rockNamesArray и rockpos, которые происходят 4 раза в трех разных строках код.

EDIT2

Как указано в комментарии, приведенный выше код размещен вне класса, который объясняет, что self не работает. Но как обратиться к процедуре таймера в этом случае?

4 ответа

у него есть неразрешенный идентификатор "я"

Похоже, код, который вы предоставили, не является частью метода экземпляра. self это ключевое слово, которое относится к объекту, код которого выполняется. Если у вас нет объекта, нет selfотсюда и ошибка. Чтобы решить эту проблему, вы можете передать указатель на другой объект, который имеет randomnumbers селектор вместо self,

Попробуй это:

var timer = NSTimer(timeInterval:3, target:self, selector:Selector("randomnumbers:"), userInfo: nil, repeats: true)

func randomnumbers(timer:NSTimer) {
    var rockNamesArray:[String] = ["bird", "rock2", "rock3"]

    var rockpos = Int(arc4random_uniform(UInt32(3)))
}

так как процедура таймера ожидает объект таймера.

Редактировать Вам нужно поместить его в (фиктивный) класс следующим образом:

class MyTimer {
  var timer: NSTimer
  init() {
    timer = NSTimer(timeInterval:3, target:self , selector:Selector("randomnumbers:"), userInfo:nil, repeats:true)
  }

  func randomnumbers(timer:NSTimer) {
    // ...
  }
}

let myTimer = MyTimer()

Написать selector: "randomnumbers" вместо selector: randomnumbers, Вы можете создать экземпляр таймера и запустить его одновременно, используя timer = NSTimer.scheduledTimerWithTimeInterval вместо timer = NSTimer(timeInterval..., Вызовите это в вашем контроллере, например, в viewDidLoad

Также обратите внимание, что ваши randomnumbers() ничего не делает. Вы присваиваете значение rockpos, но ничего с этим не делаете. Таким образом, вы не сможете увидеть, работает ли таймер...

Вы не можете ссылаться на self в качестве значения при назначении начального значения каждому сохраненному свойству до завершения первой фазы инициализации в Swift.

Как The Swift Programming Language говорит:

Инициализация класса в Swift - это двухфазный процесс. На первом этапе каждому сохраненному свойству присваивается начальное значение классом, который его ввел. Как только начальное состояние для каждого сохраненного свойства определено, начинается второй этап, и каждому классу предоставляется возможность дополнительно настроить свои сохраненные свойства, прежде чем новый экземпляр будет считаться готовым к использованию.

Инициализатор не может вызывать какие-либо методы экземпляра, читать значения любых свойств экземпляра или ссылаться на себя как на значение до тех пор, пока не завершится первая фаза инициализации.

Другие вопросы по тегам