2015-10-24 2 views
2

Я просто хочу проверить, пуст ли пул или нуль, поэтому мне интересно, безопасен ли код ниже или нет. (Будет ли это чувствительное, если новое_значение равно нуль, и система работает (новое_значение!). Подсчитывать и вызывает ошибку?)Проверяет ноль и пуст для набора одновременно в Swift?

if newValue == nil || (newValue!).count == 0{ 
    // Actions here   
} 
+1

Да это безопасно из-за короткого замыкания. Вот аналогичный вопрос о массивах: http://stackoverflow.com/q/27588964/1630618 – vacawama

+0

@vacawama Спасибо! Интересно, все языки подчиняются этому правилу, так как я знаю, что это безопасно на Java. – Desmond

+1

Если вы сомневаетесь, прочитайте [Swift documentation] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html): * «Как и логический оператор AND выше, логический Оператор OR использует оценку короткого замыкания для рассмотрения его выражений. Если левая часть логического выражения OR истинна, правая сторона не оценивается, потому что она не может изменить результат общего выражения. * * –

ответ

3

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

Это лучше использовать:

guard let newValue = newValue // First unwrap it 
     where newValue.count > 0 else { // Then check if the unwrapped value has items 
      return // If not we don't continue 
    } 

    // From this point you don't need to use ? or ! to access newValue anymore 

Всегда старайтесь использовать безопасные модели в вашем Swift код. Для меня кастинг! это код запах, и я всегда стараюсь, чтобы заменить его, если пусть вещь = вещь или охранник пусть вещь = вещь заявление

+0

Это Swift 2.0 новая функция, и я думаю! делает код короче. – Desmond

+0

Вы имеете в виду до тех пор, пока первая ложная: P в противном случае у нас был бы сбой –

+1

Xcode 7 уже в течение нескольких недель, я предположил, что вы использовали последнюю версию. Существует «быстрый способ сделать что-то», точно так же, как вы должны использовать Python, даже если он также позволяет вам делать что-то на Java как путь. Swift - это очень безопасный язык, и вы должны делать что-то безопасно, когда можете это сделать. Последняя причина заключается в том, что использование охранника таким образом говорит читателю вашего кода больше о намерениях того, что вы хотите сделать. ** guard ** всегда используется для проверки того, что некоторые вещи верны, а некоторые опции доступны, прежде чем продолжить выполнение. –

1

В этом случае это безопасно. Потому что первая часть делает все утверждение истинным, поэтому нет необходимости оценивать вторую часть.

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

Для немного более общей reading

+0

Согласно оптимизации, если 'newValue == nil' истинно, тогда все выражение истинно. Поэтому я думаю, что '(newValue!). Count == 0' никогда не будет работать ... Но если вы правы, есть ли другой способ проверить оба условия одновременно? – Desmond

+0

извините, внес изменения в мой ответ, поскольку я ошибся в начале –

+0

Все в порядке. Вы также предоставили мне дополнительные советы. – Desmond

1

Это утверждение прекрасно и сохранить.

Правильный термин для такого поведения языков программирования: short-circuit evaluation.

Булевы операторы выполняются только до тех пор, пока утверждение не может по-прежнему приводить к true и false - как только результат определяется, он заканчивается.

Для && это означает, что если один оператор равен false, выполнение останавливается.
Для || это означает, что если один оператор равен true, выполнение останавливается.

+0

Спасибо! Это означает, что все языки подчиняются этому правилу. – Desmond

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