Actualmente estoy comenzando a trabajar en un proyecto, y mi primera tarea es descomponer un Objeto de Dios que otra persona creó a partir del AppDelegate. Comencé copiando el código relacionado con la administración de la ubicación, con la intención de delegar llamadas a ese código en el nuevo objeto.

Sin embargo, tengo dos declaraciones que me están volviendo loco.

Archivo nuevo:

if locationManager?.location?.horizontalAccuracy > horizontalAccuracyCheck{...}

Archivo antiguo:

if locationManager?.location?.horizontalAccuracy > horizontalAccuracyCheck{...}

Notarás que el código es idéntico. En ambos casos self.locationManager? Se define como:

var locationManager: CLLocationManager?

Pero en el nuevo archivo, recibo una advertencia sobre 'valor de tipo opcional sin desenvolver': ¿por qué? Código duplicado exacto, copiado y pegado, ¿qué lo haría diferente?

Cambiar el código para desenvolverlo arregla las cosas:

if (locationManager?.location?.horizontalAccuracy)! > horizontalAccuracyCheck{...}

Puedo entender por qué necesito desenvolver explícitamente un retorno potencialmente opcional. Pero ... ¿por qué solo en un lugar?

0
RonLugge 5 ene. 2017 a las 02:52

2 respuestas

La mejor respuesta

Como se discutió en estas preguntas y respuestas, el migrador Swift insertará una sobrecarga de operador fileprivate personalizada para permitir las comparaciones funcionen en Swift 3 de la misma manera que lo hicieron en Swift 2. Debido a que esta sobrecarga es fileprivate, no podrás usarla desde ningún otro archivo fuente en tu proyecto que no lo defina también, por lo tanto, por qué su comparación no se compila en el nuevo archivo fuente.

Por lo tanto, una solución es copiarlo en su nuevo archivo. Otra es eliminar el modificador de acceso fileprivate. La sobrecarga estará predeterminada en internal y, por lo tanto, estará accesible para otros archivos Swift en su módulo.

Aunque realmente recomendaría eliminar la sobrecarga por completo y, en su lugar, escribir su propia lógica explícita para la comparación opcional cuando surja: la sobrecarga se puede usar con demasiada facilidad (como lo demuestra Propuesta de evolución rápida para eliminarla).

2
Community 23 may. 2017 a las 12:33

La razón es que estamos hablando de dos idiomas bastante diferentes. Un archivo es Swift 2, el otro archivo es Swift 3.

En Swift 2, puede comparar un Opcional que representa un número con otro número utilizando el operador mayor o menor que. En Swift 3, no puedes hacer eso.

Aquí hay un ejemplo más simple de lo mismo:

    let optint : Int? = 7
    let ok = optint < 42

Ese código es legal en Swift 2 pero ilegal en Swift 3.

3
matt 5 ene. 2017 a las 00:06