2015-11-17 4 views
0

Я делаю приложение, где мне нужно поставить много сообщений if/else , Я знаю, что вы можете делать это как в названии на каком-то другом языке кодирования, но я не уверен, можете ли вы это сделать в Swift.Сокращение If/Else from if (x == y || x == z) до if (x == y || z) в swift

Как вы сократить это:

if x == y || x == z { 
    //do something 
} 

Чтобы что-то вроде этого:

if x == y || z { 
    //do something 
} 
+0

Какие другие языки, из интереса? – Bathsheba

+0

@ Bathsheba Tbh Я не помню, но я помню, как это делалось, просто не так. – StevoHN

+1

В C, C++ и Java эти две формы разные. – Bathsheba

ответ

3

Я conject, что не существует никакого разумного языка (скоро в комплекте), что распространяет сравнения ==через логический или ||.

Способ, которым вы его написали - x == y || x == z - это самая компактная форма.

8

Может быть, вы могли бы рассмотреть возможность использования массива и проверки, чтобы увидеть, если x находится в массиве, как в следующем примере:

let (x, y, z) = (3, 8, 3) 

if [y, z].contains(x) { 
    //True 
} 

Если вы сравниваете объекты (например, UIImage), используйте containsObject вместо contains:

if [x, y, z].containsObject(y) { 
    //True 
} 
+0

Yup, просто пытался найти это. Я думаю, что это лучшее решение. – Fogmeister

+0

Любой усыновитель должен профилировать производительность. – Bathsheba

+0

@Jack Greenhill - я просто пытался сделать это таким образом, однако, похоже, что он не работает с UIImages. 'if imageArray.contains (tile11.currentImage) { }' – StevoHN

3

Jack Greenhill's answer действительно идет в правильном направлении. Однако с большим количеством значений его метод будет очень неэффективным, поскольку он должен проверять каждый элемент массива на равенство, поэтому сложность O(n).

Следует использовать очень недооцененную структуру данных, которая может выполнять этот вид операции в O(1): Set. Он использует хеш-значения, чтобы быстро проверить, присутствует ли значение или нет. Вы можете использовать его как это:

let x = 3 
let values : Set = [1, 3, 6, 1, 7] // {6, 7, 3, 1} 

if values.contains(x) { 
    // ... 
} 

Это занимает столько же времени, values содержит ли только один или 1000 элементов. Массив будет в 1000 раз медленнее.

Зачастую решение использовать массив выполняется до того, как он даже рассмотрит набор. Если ваши элементы не имеют какого-либо порядка и могут возникать только один раз (что на самом деле происходит чаще, чем вы думаете), вам, вероятно, нужен набор. Набор дает вам полезные методы, такие как union, isSubset, interception и более, бесплатно, просто поместив в него свои элементы. Единственное дополнительное требование для типа элемента - соответствовать Hashable.