2016-09-21 2 views
3

Я работаю с парными, которые имеют диапазон 0..<360. Я хочу создать оператор switch, который будет иметь 8 случаев. Случай для 0, 90, 180 и 270 и случай для значений между ними. Кажется, что полуоткрытый оператор не удовлетворит то, что я пытаюсь сделать здесь. Я думаю, что решение может заключаться в создании пользовательского реляционного оператора. Давайте назовем это <..<Как сделать собственный реляционный оператор в Swift

case 0: 
case 0<..<90: 
case 90: 
case 90<..<180: 
case 180: 
case 180<..<270: 
case 270: 
case 270<..<360: 

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

Как это сделать?

+0

Случаи не обязательно должны быть взаимоисключающими, они проверяются в определенном порядке, а первый выигрывает. У вас может быть «случай: 0», за которым следует «case: 0 .. <90'. –

+0

Спасибо @MartinR. Это отлично работает. – MyBikeIsAwesome

+0

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

ответ

1

Ваш коммутатор излишне усложнен. Посмотрите, работает ли это для вас:

let value: Double = 180 

switch value { 
    case 0: 
     print("exactly 0") 
    case 0..<90: 
     print("less than 90") 
    case 90: 
     print("exactly 90") 
    case 90..<180: 
     print("less than 180") 
    case 180: 
     print("exactly 180") 
    case 180..<270: 
     print("less than 270") 
    case 270: 
     print("exactly 270") 
    default: 
     print("less than 360") 
} 
+0

В этом случае мне нужно было бы выполнить другое действие, если значение было 180, чем если бы оно было 180.1. Таким образом, полуоткрытый реляционный оператор не отвечает моим требованиям. – MyBikeIsAwesome

+0

«Случай» Свифта не проваливается. Он завершает оператор 'switch', как только будет найдено совпадение. См. Мой обновленный ответ –

+0

Ваш обновленный ответ работает отлично. Спасибо. – MyBikeIsAwesome