Быстрые ошибки с использованием #if, #endif - PullRequest
3 голосов
/ 12 марта 2019

При использовании #if, #endif в Swift (при использовании Xcode) выдает ошибки, если вмешивается в поток операции. Этот скриншот говорит сам за себя:

Swift #if, #endif error

Кто-нибудь знает решение, позволяющее сделать этот пример без повторения всего блока кода дважды? Могут легко возникнуть ситуации, когда весь блок может быть очень большим.

РЕДАКТИРОВАТЬ: мой образец был слишком простым. Вот новый пример, где «else if» зависит от того же определения (DEBUG). «Else if» также должно быть внутри #if и #endif. И другие образцы могут быть намного сложнее, чем этот.

enter image description here

Ответы [ 3 ]

5 голосов
/ 12 марта 2019

В идеале, максимально ограничить использование #if. Использование директив препроцессора всегда немного пахнет кодом. В этом случае вы можете просто использовать логическую переменную:

#if DEBUG
let debug = true
#else
let debug = false
#endif

Тогда просто используйте переменную:

var a = 0
var b = 0

...

else if debug && a == b {
}

В режиме выпуска код станет недоступным, и оптимизатор все равно удалит его.

Немного воображения, мы можем найти другие решения, например, мы можем переместить проверку в функцию:

func isDebugCheck(a: Int, b: Int) -> Bool {
   #if DEBUG
      return a == b
   #else
      return false
   #endif
}

или мы можем переместить весь код в отдельную функцию и заменить if-else на return (или continue, в зависимости от ваших потребностей), например ::

if a == 7 {
  ...
  return
}

#if DEBUG
  if a == b {
     return
  }
#endif

if ...
2 голосов
/ 12 марта 2019

Как отмечает @ user28434, препроцессор уровня источника отсутствует.Это избавило от множества хитрых проблем препроцессора в C (таких как причудливые потребности в скобках, чтобы все работало).

Однако #if хорошо интегрирован в язык и специально поддерживает switch именно для таких случаев.

var a = 0

#if DEBUG
let b = 0
#endif

switch a {
case 7: a += 1
    #if DEBUG
case b: a += 2
    #endif
case 5: a += 3
default:
    break
}
1 голос
/ 12 марта 2019

Вы можете просто добиться этого с помощью кода ниже:

if a == b {
    #if DEBUG
    a += 2
    #else
    a += 1
    #endif
} else if a == c {
    a += 3
}
...