2015-05-26 3 views
0

У меня есть RNG и хочу, чтобы он уходил каждые три секунды. До сих пор у меня естьКак использовать 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))) 
} 

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

EDIT

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

EDIT2

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

+0

Какое сообщение об ошибке? –

+1

В общем, нам все равно, чтобы скопировать/вставить ваш код в шаблон шаблона, чтобы узнать, какие ошибки вы получаете. Пожалуйста, дайте их нам в вопросе. (Обратите внимание, что я сказал _ в вопросе_; ** не ** публиковать их в комментариях) –

+0

Вы не можете ссылаться на 'self' на первом этапе двухфазной инициализации при назначении начального значения вашему хранимому свойству' timer '. Пожалуйста, проверьте главу' Инициализация' 'Swift Язык программирования' для более подробной информации. – tounaobun

ответ

0

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

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))) 
} 

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

Edit Вы должны поместить его внутрь (фиктивной) класса, как это:

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() 
+0

это говорит о том, что использование нерешенного идентификатора self. У меня есть это снаружи viewcontroller, но если я поместил его в класс viewcontroller, то RNG не будет работать. – thoselakers

+0

В чем смысл myTimer? – thoselakers

+0

Просто чтобы создать экземпляр вашей программы таймера, чтобы он мог работать. –

0

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

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

+0

Вероятно, это не сработает, поскольку процедура таймера ожидает объект таймера в качестве параметра. –

1

это нерешенная идентификатор «Я»

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

0

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

В The Swift Programming Language говорит:

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

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

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