Если оператор, наличие условия соответствует определенным числам, а переменная увеличивается - PullRequest
0 голосов
/ 24 апреля 2019

Простые проблемы, которые я просто не могу понять в моей маленькой голове. У меня есть переменная, которая будет обновляться и последовательно увеличиваться, то есть 0, 1, 2, 3, 4 ... и так далее, чтобы было ясно. Я пытаюсь реализовать условие для случаев, когда цифры 1 и 2 звукового сигнала, а для 3 и 4 сделать это, это должно чередоваться. позвольте мне показать вам, используя код.

func doSomething(number : Int) {
    //number is increment sequentially: 0, 1, 2, 3, 4...
    let number : Int = number
    if number is 1, 2, 5, 6, 9, 10... {
        //play a sound
    } else if number is 3, 4, 7, 8, 11, 12... {
        //vibrate
    }
}

Меня беспокоит не то, что происходит внутри операторов if, а логика в условии оператора if.

Ответы [ 4 ]

5 голосов
/ 24 апреля 2019

Вот общая альтернатива: не увеличивать число. Номера не нужны; они красная сельдь. Вам нужно выполнить определенное «следующее» действие каждый раз, когда нам нужно новое действие. Итак, давайте напишем конечный автомат , где каждое последующее изменение состояния ведет себя так, как вы описываете.

struct StateMachine {
    enum TickTock {
        case tick
        case tock
    }
    private var tickTock = TickTock.tock
    private var alternator = false
    mutating func nextState() {
        self.alternator = !self.alternator
        if self.alternator {
            self.tickTock = self.tickTock == .tick ? .tock : .tick
        }
        print(self.tickTock)
    }
}

Таким образом, единственное, что вам нужно сделать, это держать экземпляр StateMachine под рукой и вызывать его nextState каждый раз, когда вам нужно выполнить новое действие. Вот тест и его вывод (не надо вводить в заблуждение в цикле; в этой истории нет реальных чисел, это просто тестовый стенд):

var machine = StateMachine()
for _ in 0..<20 {
    machine.nextState()
}
/*
tick
tick
tock
tock
tick
tick
tock
tock
tick
tick
tock
tock
tick
tick
tock
tock
tick
tick
tock
tock
*/

Если каждый раз, когда мы печатаем «тик», вы издаете звук, а каждый раз, когда мы печатаем «ток», вы вибрируете, вы будете делать именно то, что требует ваша спецификация.

3 голосов
/ 24 апреля 2019
if (number % 4) == 1 || (number % 4) == 2 {
    ding()
} else {
    wiggle()
}
2 голосов
/ 24 апреля 2019
if ((number + 1) / 2) % 2 == 1 {
    // play a sound
} else {
    // vibrate
}
1 голос
/ 24 апреля 2019

Это похоже на ответ @ rmaddy, но использует меньше операций:

if (number + 1) & 2 == 2 {
    // play a sound
} else {
    // vibrate
}

Как это работает?

Это работает, наблюдая, что при подсчете в двоичном виде:

1   001
2   010
3   011
4   100
5   101
6   110
7   111

цифра двух (вторая цифра справа) изменяется следующим образом: 0 1 1 0 0 1 1 0 0 .... Добавляя один, мы смещаем шаблон к 1 1 0 0 1 1 0 0 .... Итак, чтобы проверить цифру 2, выполните поразрядно И (&) с помощью 2 и убедитесь, что это 2.

Я бы сделал это так, если бы программировал на ассемблере, но для Swift мне нравится решение @ matt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...