ios swift uitextfield

ios - ¿Por qué es UITextField.text un opcional?



text field ios 11 (2)

Comienza como una cadena vacía en lugar de nula. Incluso cuando se establece explícitamente en nil, permanece una cadena vacía. No lo entiendo Tal vez para que sea fácil de borrar asignando nil? Escribir código con él es torpe.

var textField = UITextField() print(textField.text) // prints "Optional("")" textField.text = nil print(textField.text) // prints "Optional("")"


Esto es una cosa histórica. UITextField no hace ninguna diferencia entre una cadena vacía y una cadena nil . En Objective-C no había necesidad de marcar una diferencia entre ellos porque puede llamar a los métodos en nil en Objective-C.

Además, en Objective-C no había forma de evitar que los usuarios asignaran nil a una propiedad. El contrato resultante es que el text puede ser opcional. En Objective-C eso no hace ninguna diferencia.

En Swift no hay mucho que podamos hacer porque el contrato de UITextField.text tendría que cambiar, posiblemente rompiendo un montón de código ya escrito. Tenga en cuenta que incluso si nunca se devuelve nil desde el método, aún puede asignar nil para restablecer el valor.

Puedes encontrar cientos de situaciones similares en las API antiguas.


Estoy lo suficientemente convencido de esto como para repetir mi comentario sobre la respuesta de Sulthan como una respuesta alternativa.

No estoy seguro de que la respuesta de Sulthan realmente responda a la pregunta.

No puedo "encontrar cientos de situaciones similares". Eso es porque ya no están allí. Estaban allí en Swift 1, pero eso fue hace mucho tiempo. Desde entonces, las API se han modificado manualmente para eliminarlas. Este no fue eliminado.

La idea general de modificar manualmente las API era eliminar los opcionales innecesarios. Cientos de valores pueden ser teóricamente nil pero en realidad nunca lo serán, y en Swift no son Opcionales. Este valor nunca puede ser nil ; incluso si el código de Objective-C lo establece en nil , no se vuelve nil . Y hacerlo no Opcional en Swift no "rompería" nada de nada. Así que no tiene sentido que sea una Opcional en Swift.

Creo que la respuesta correcta, por lo tanto, es que es un error. Durante la eliminación de IUO en el curso de ajustar manualmente las API en el período previo a Swift 2.0, el texto de la etiqueta y el campo de text debería haberse caracterizado como una Cadena no Opcional, y no lo fue.