«Результат '&&' unused” предупреждения в блоке do / try / catch - PullRequest
0 голосов
/ 08 мая 2019

Я пытался понять, что происходит безрезультатно.Я извлек код настолько, насколько это возможно, но я все еще получаю предупреждение «Результат оператора && не используется» (даже если он используется), если я делаю это в проекте, но тот же код, скопированный в Playground, работает нормально без предупрежденийЭто просто какой-то фиктивный код, после того, как я снова переписал основной код, пытаясь найти проблему.

enter image description here

enum WordError: Error {
    case tooShort
    case tooLong
}


func isTooShort(_ word: String) throws -> Bool {
    if word.count < 3 { throw WordError.tooShort }
    return true }

func isTooLong(_ word: String) throws -> Bool {
    if word.count > 5 { throw WordError.tooLong }
    return true }


func check(_ word: String) {

    do {
        try isTooShort(word) && isTooLong(word)
        print(word)
    } catch let error as WordError {
        print("\(error)")
    } catch {
    }
}

Это простоошибка или я здесь что-то не так делаю?

Я решил, что смогу отключить предупреждение, если использую:

 try _ = isTooShort(word) && isTooLong(word)

Но я не уверен, что это правильный способ «исправления»это.

1 Ответ

3 голосов
/ 08 мая 2019

В этом нет ничего плохого. «Правильный» способ, когда что-то вроде isTooShort принадлежит вам и вы хотите вызвать его без захвата результата, это пометить его как @discardableResult. Если бы вы сделали это, вы могли бы написать

do {
    try isTooShort(word)
    try isTooLong(word)
    print(word) // if we get here, it's neither too short nor too long
} catch ...

Но то, что вы делаете, также "правильно" в этих обстоятельствах.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * *1001* 1010 * * * * * * * * * * * * * * * * * * * * 100 * *. Ваша реализация isTooShort очень странная. Вы, кажется, неправильно используете throw. Не ясно, какую проблему вы пытаетесь решить, реализовав ее таким странным способом. isTooShort может потерпеть неудачу только одним способом: слово слишком короткое. Так почему бы просто не вернуть Bool? isTooShort задает простой вопрос «да / нет», так что просто ответьте: верните Bool и остановитесь.

Если ваша цель - ответить на вопрос трех , то есть сообщить вызывающему абоненту, было ли это слово слишком коротким, слишком длинным или просто правильным, а затем просто верните пользовательское перечисление, которое отвечает на вопрос:

enum WordLength {
    case tooShort
    case tooLong
    case justRight
}

func howIs(_ word: String) -> WordLength {
    if word.count < 3 { return .tooShort }
    if word.count > 5 { return .tooLong }
    return .justRight
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...