Корпус переключателя с диапазоном - PullRequest
0 голосов
/ 05 октября 2018

Я изучаю Swift и пытался самостоятельно запрограммировать игру «Буллсай» от Райана Вендерлиха перед просмотром видео.

Мне нужно было давать пользовательские очки в зависимости от того, насколько близко к целевому числу онбыло.Я попытался вычислить разницу и затем проверить диапазон и дать пользователю баллы. Это то, что я сделал с If-else (Не удалось сделать это с переключателем):

private func calculateUserScore() -> Int {
    let diff = abs(randomNumber - Int(bullsEyeSlider.value))
    if diff == 0 {
        return PointsAward.bullseye.rawValue
    } else if diff < 10 {
        return PointsAward.almostBullseye.rawValue
    } else if diff < 30 {
        return PointsAward.close.rawValue
    }
    return 0 // User is not getting points. 
}

Есть лиспособ сделать это более элегантно или с Switch-Case?Я не мог просто сделать diff == 0, например, в случае с переключателем, поскольку xCode выдает мне сообщение об ошибке.

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Это должно сработать.

private func calculateUserScore() -> Int {
    let diff = abs(randomNumber - Int(bullsEyeSlider.value))
    switch diff {
    case 0:
        return PointsAward.bullseye.rawValue
    case 1..<10:
        return PointsAward.almostBullseye.rawValue
    case 10..<30:
        return PointsAward.close.rawValue
    default:
        return 0
    }
}

Это буквально есть в книге Язык программирования Swift - Swift 4.2 в разделе Поток управления -> Сопоставление интервалов.

0 голосов
/ 05 октября 2018

Вы должны использовать операторы диапазона в качестве регистра-оператора:

a...b // Он имеет диапазон от a до b, означает, что b также включен

a..<b // Он имеет диапазон от a до b-1, означает, что b не включен

private func calculateUserScore() -> Int {
    let diff = abs(randomNumber - Int(bullsEyeSlider.value))
    switch diff {
    case 0: return PointsAward.bullseye.rawValue
    case 1..<10: return PointsAward.almostBullseye.rawValue
    case 10..<30: return PointsAward.close.rawValue
    default: return 0
    }
}
0 голосов
/ 05 октября 2018

Только для вас:

enum PointsAward: Int {
    case close
    case almostBullseye
    case bullseye
}

private func calculateUserStory() -> Int {
    let bullsEyeSliderValue = 9
    let randomNumber = 100
    let diff = abs(randomNumber - Int(bullsEyeSliderValue))
    switch diff {
    case 0:
        return PointsAward.bullseye.rawValue
    case 0..<10:
        return PointsAward.almostBullseye.rawValue
    case 0..<30:
        return PointsAward.close.rawValue
    default: return 0
    }
}
0 голосов
/ 05 октября 2018

Вы можете вернуть нужные значения соответственно

switch diff {
        case 0 :
            print("Bull Eye")
        case 1..<10 :
            print("Almost Bull Eye")
        case 10..<30 :
            print("Close")
        default :
            print("Too Far")
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...