2015-06-09 7 views
1

Это очень простой кусок кода, но я чувствую, что есть более элегантный способ сделать это:Есть ли лучший способ сделать это?

if timeOfLastUpdate == nil { 
     timeOfLastUpdate = currentTime 
     return 
    } 

    //"Infinitesimal" moment of time used to update the position of the orbiter 
    let dt:CFTimeInterval = currentTime - timeOfLastUpdate! 
    timeOfLastUpdate = currentTime 

    //Other code 

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

а) я проверяю, если значение равно нулю, вместо того, чтобы использовать какой-то необязательной СЦЕПЛЕНИЕ

б) Линия timeOfLastUpdate = currentTime повторяется дважды.

Есть ли лучший способ сделать это? Что-то более похоже на Свифт?

+0

есть причина timeOfLastUpdate начинается как ноль? Если вы можете удалить необходимость проверки nil, вам не нужно будет делать то, что вы считаете неэлегантным. Прямо сейчас, при первом вызове этого кода вы пропускаете время дельта, просто устанавливая timeOfLastUpdate, но не должно быть дельта-времени? Время дельта между тем, когда начинается ваш орбитальный аппарат, и когда это называется первым? –

+0

@WillM. Ну, timeOfLastUpdate должен представлять время с момента последнего вызова функции «update». Если это первый раз, когда он вызывается, «timeOfLastUpdate» будет неопределенным, не так ли? Следовательно, ниль. Если ваше высказывание о том, что время дельты должно быть разницей между тем, когда орбитальный элемент добавлен в сцену и первым «обновлением», я не могу этого сделать, потому что орбитальный элемент добавлен в сцену редактором SKS, а не через мой код , –

+0

Вам не нужен первый вызов функции обновления, чтобы что-то сделать? Как сделать первое обновление, основанное на том, что произошло между началом прогресса и первым вызовом для обновления. Прямо сейчас, вы просто отбрасываете то время, которого никогда не было. –

ответ

0

Как об этом:

if timeOfLastUpdate = timeOfLastUpdate 
{ 
    dt = currentTime - timeOfLastUpdate 
} 

timeOfLastUpdate = currentTime 

Если вам нужен код для возврата без запуска вашего «другого кода» в том случае, когда «timeOfLastUpdate является нолем, то, возможно, необходимо иметь свое timeOfLastUpdate = currentTime назначение появляется дважды:

if timeOfLastUpdate = timeOfLastUpdate 
{ 
    dt = currentTime - timeOfLastUpdate 
    timeOfLastUpdate = currentTime 
    return 
} 
else 
{ 
    timeOfLastUpdate = currentTime 
} 

//other code here. 
+0

Я боюсь, что это не эквивалентно. Обратите внимание, что оператор return - это его код. –

0

Как насчет этого?

if let _timeOfLastUpdate = timeOfLastUpdate, let dt = currentTime - _timeOfLastUpdate { 
    //other codes 
} 

//if this line of code can be placed after "//other codes", cause I see it must be placed before //other codes 
timeOfLastUpdate = currentTime 
+0

Проблема в том, что «другой код» довольно длинный, поэтому я не хочу помещать его в оператор if. –

+0

Вы можете поместить // другие коды в функцию, а затем просто вызвать эту функцию в этом месте. –

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