Как обрабатывать необязательные параметры в операторах switch

У меня есть следующий код:

for compareValues in [(optionalVal1, optionalVal2), (optionalVal3, optionalVal4)] {
    switch compareValues {
    case (nil, nil):
      break
    case (_, nil):
      return true
    case (nil, _):
      return false
    case let (lValue, rValue):
      return lValue < rValue
    }
}

Это не компилируется, последняя строка вызывает эту ошибку:

Значение необязательного типа 'String?' не развернутый; Вы хотели использовать '!' или '?'?

Как бы вы предложили справиться с этим без принудительной распаковки lValue и rValue?


person Forge    schedule 04.02.2017    source источник
comment
Почему нельзя принудительно развернуть? Есть только 4 случая, и все nil случая уже покрыты.   -  person vadian    schedule 04.02.2017


Ответы (2)


Чтобы развернуть опции в операторе case, вы можете использовать

case let (.some(lValue), .some(rValue)):

person Gereon    schedule 04.02.2017
comment
Да, или case let (lValue?, rValue?). - person Rob; 04.02.2017

Учитывая, что если вы добрались до оператора case let (lValue, rValue), вы знаете, что они оба не nil, вы можете безопасно принудительно развернуть их в этот момент:

for compareValues in values {
    switch compareValues {
    case (nil, nil):
        break
    case (_, nil):
        return true
    case (nil, _):
        return false
    case let (lValue, rValue):
        return lValue! < rValue!
    }
}
person Rob    schedule 04.02.2017