Как использовать 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 - это двухфазный процесс. На первом этапе каждому сохраненному свойству присваивается начальное значение классом, который его ввел. Как только начальное состояние для каждого сохраненного свойства определено, начинается второй этап, и каждому классу предоставляется возможность дополнительно настроить свои сохраненные свойства, прежде чем новый экземпляр будет считаться готовым к использованию.
Инициализатор не может вызывать какие-либо методы экземпляра, читать значения любых свойств экземпляра или ссылаться на себя как на значение до тех пор, пока не завершится первая фаза инициализации.