operator infix guide basics swift operators automatic-ref-counting iboutlet

infix - Swift, dos cuestiones. 1) débil var 2) operador bang para @IBOutlet



swift reference (4)

Por:

@IBOutlet weak var nameLabel: UILabel!

  1. Cuando declaro mis IBOutlets, solo uso var en lugar de débil var. Pero recientemente me he encontrado con algunas plantillas de código que utilizan var débil. ¿Por qué lo hacen? ¿Cuál es el beneficio adicional?

  2. ¿Por qué hay un operador bang al final de UILabel? Sé que es necesario y lo acompaño, pero solo pregunto ahora.

Gracias por adelantado.


  1. Swift IBOutlet son débiles por defecto (pero otras propiedades son fuertes por defecto). Así que ambos escritos son los mismos.

Tienes más detalles sobre la diferencia entre débil y fuerte here

  1. Según documentación de manzana.

Cuando declara una salida en Swift, debe hacer que el tipo de salida sea un opcional implícitamente desenvuelto (!). De esta manera, puede dejar que el guión gráfico conecte las salidas en tiempo de ejecución, después de la inicialización.


  1. La respuesta de @gregheo es la mejor explicada, para una mayor explicación: si considera la propiedad en esta situación, el objeto de Vista al que hace referencia @IBOutlet generalmente no debe ser propiedad del Controlador de Vista que se refiere a él.

    Más bien, debe ser propiedad de su supervisión en cualquier lugar que se encuentre en el árbol (lo que sucede en gran UIView.subviews en UIView.subviews ). El controlador de vista, en cambio, posee la raíz de su árbol de vista ( UIViewController.view ). weak declara explícitamente una referencia no propietaria que puede volverse nula en diferentes puntos de la vida del Controlador de vista.

  2. Aquí te ofrecería una alternativa al uso ! : el uso de una referencia opcional implícitamente sin envolver es una práctica peligrosa que debilita las herramientas que Swift nos ofrece. Un controlador de vista que se carga desde Xib o Storyboard incluye en su vida útil un tiempo regular después de su creación y antes de que se haya cargado la @IBOutlet donde la referencia @IBOutlet es nula, cada vez. Suponer que nadie operará con el miembro durante ese tiempo significa no utilizar la gramática Swift y los comentarios del compilador para nuestro beneficio.

    Además, los @IBOutlet s son una herramienta poderosa que permite un enfoque flexible y visualmente enfocado al diseñar una pantalla o vista. Es una práctica común que su View Controller exponga @IBOutlet s para toda la información que tiene disponible, independientemente de si se sabe o no que se usará y decidir por separado qué conexión y uso se realizará al compilar e iterar en la vista desde dentro de Interface Builder.

    Además, además, si su Vista debe ser lo suficientemente flexible como para ser instanciada desde Xib / Storyboard Y desde el código, dependiendo de cómo decida, las subvistas a las que se hace referencia deben ser instanciadas y conectadas, pueden o no estar disponibles inmediatamente.

Por las razones anteriores, defino el mío: @IBOutlet weak var nameLabel: UILabel?


Los puntos de venta son débiles ya que los elementos de la vista son propiedad (fuertemente) de la vista. Creo que técnicamente está bien que su controlador de vista también tenga una referencia sólida, pero no es necesario.

Las variables débiles son opcionales ya que pueden ser nil . Usted puede declarar sus puntos de venta con ? en su lugar, pero eso significa usar el desenvolvimiento de la fuerza o un enlace opcional cada vez. Declarándolos como opcionales implícitamente sin envolver con ! Es solo una conveniencia.


Usas débil cuando te refieres a IBOutlets porque mientras el objeto permanezca en su supervisión, habrá una fuerte referencia a él. Ver débil o fuerte para IBOutlets . A continuación, el operador bang indica que el IBOutlet es una etiqueta explícitamente desenvuelta. Con el operador bang, garantiza que el objeto existirá, por lo que al hacer referencia a él, simplemente puede hacer referencia a él de la siguiente manera:

someLabel.text = "some text"

Sin embargo, puedes hacer que los IBOutlets sean opcionales:

@IBOutlet weak var someLabel: UILabel?

Pero debes usar ? al acceder a ellos

someLabel?.text = "some text"