¿Puede un cambio rápido ser exhaustivo para el tipo Doble sin un caso predeterminado?
Este cambio (sin un caso predeterminado) da el error: el cambio debe ser exhaustivo:
var minY = 1.0 switch minY { case -(Double.infinity)..<0.9: yAxisMinimum = 0.0 case (0.9..<0.99): yAxisMinimum = 0.9 case (0.99..<0.999): yAxisMinimum = 0.99 case (0.999..<0.9999): yAxisMinimum = 0.999 case (0.9999...Double.infinity): yAxisMinimum = 0.9999 }Pero este interruptor, con el caso predeterminado (inútil), funciona:
var minY = 1.0 switch minY { case -(Double.infinity)..<0.9: yAxisMinimum = 0.0 case (0.9..<0.99): yAxisMinimum = 0.9 case (0.99..<0.999): yAxisMinimum = 0.99 case (0.999..<0.9999): yAxisMinimum = 0.999 case (0.9999...Double.infinity): yAxisMinimum = 0.9999 default: yAxisMinimum = 0.0 }Intento evitar los casos predeterminados con mis interruptores, pero no sé si eso es posible con un Doble.
No, porque solo los tipos de enumeración se pueden comprobar exhaustivamente .
Pero en este caso, el problema es aún más profundo. Incluso si Integers pudiera verificarse exhaustivamente, aún no podría verificar exhaustivamente Double sin una cláusula where . Una de las opciones es .nan ("no es un número"), que no está considerando. Así que podrías pensar en simplemente agregar ese caso:
case .nan: yAxisMinimum = .nanEsto no solo no lo hará exhaustivo, sino que ni siquiera funcionará de la manera esperada.
var minY = Double.nan switch minY { case -(Double.infinity)..<0.9: yAxisMinimum = 0.0 // ... case .nan: yAxisMinimum = .nan default: yAxisMinimum = 0 } yAxisMinimum // 0¿Por qué? Debido a esto:
var minY = Double.nan minY == .nan // false NaN es desigual a todo , incluido NaN. Por lo tanto, no hay forma de incluirlo directamente en una declaración de cambio. Tienes que usar una cláusula where :
case _ where minY.isNaN: yAxisMinimum = .nanY eso definitivamente está más allá de la capacidad de validación del compilador.