Подтвердить что ты не робот

Использование "if let" с логическим "или" оператором

Я пытаюсь написать следующий блок кода в единственной строке if let:

 if let amount = datasource?.incrementForCount?(count) {

        count += amount
    }

    else if let amount = datasource?.fixedIncrement {
        count += amount
    }

когда я пытаюсь что-то вроде:

 if let amount = datasource?.incrementForCount?(count) ||  let amount = datasource?.fixedIncrement {

        count += amount
    }

Я получил ошибку времени компиляции.

Я не думаю, что предложение where возможно для этого случая.

Можно ли объединить два оператора if let в один ORed один?

4b9b3361

Ответ 1

Попробуйте использовать оператор ??:

if let amount = datasource?.incrementForCount?(count) ?? datasource?.fixedIncrement 
{
    count += amount
}

Можно ли объединить 2, если пусть утверждения в один ORed?

Возможно иметь несколько операторов let, таких как

if let a = optionalA, b = optionalB { ... }

И все они должны возвращать значение, отличное от nil.

Но если вы также хотите использовать логическое условие:

  • Может быть только один
  • Должно быть размещено на первом месте, перед любыми инструкциями let

Ответ 2

Нет, вы не можете OR два оператора if-let или даже оператор if-let с условием non if-let, потому что это полностью уничтожит назначение оператора if-let. if-let гарантирует, что вы можете ввести тело оператора только в том случае, если опция может быть успешно распакована в переменную.

let str:String? = nil
if let s = str || true {
  //s is nil, yet you're still in the if-let body
}

В приведенном выше примере вы все равно войдете в необязательное тело, даже если s было равно нулю, и в этом случае вам все равно нужно проверить, нет ли s, или нет внутри тела, отображая первую проверку if-let бессмысленно.