Implícitamente desenvuelto opcional cuando es constante que no se puede definir durante la inicialización, pero el error viene -- swift campo con initialization campo con options camp Relacionados El problema

Implicitly Unwrapped Optional when a constant that cannot be defined during initialisation, But Error Comes


0
vote

problema

Español

por drewag en su respuesta a la pregunta

Cada constante miembro debe tener un valor para la inicialización del tiempo. A veces, una constante no se puede inicializar con su valor correcto durante la inicialización, pero aún se puede garantizar que se le garantice que tenga un valor antes de poder acceder.

El uso de una variable opcional se convierte en este problema porque un opcional se inicializa automáticamente con NIL y el valor que eventualmente contenerá todavía será inmutable. Sin embargo, puede ser un dolor para desenvolver constantemente una variable que sabe con seguridad no es nula. Las opciones implícitamente desenrolladas logran los mismos beneficios que son opcionales con el beneficio adicional que uno no tiene que desenvolverlo explícitamente en todas partes.

El siguiente código define dos clases, Country y City , cada uno de los cuales almacena una instancia de la otra clase como una propiedad. Cada país debe tener una ciudad capital y cada ciudad siempre debe pertenecer a un país.

  class Country {     let name: String     var capitalCity: City! //why I can't use let!     init(name: String, capitalName: String){         self.name = name         self.capitalCity = City(name: capitalName, country: self)     }          deinit {         print("(name) has been de-initialized the city (capitalCity.name) is gone with with the country")     }      }  class City{     let name: String     unowned let country: Country     init(name: String, country: Country){         self.name = name         self.country = country     }          deinit {         print("The city (name) has been de-initialized ")     } }      var country = Country(name: "Canada", capitalName: "Ottawa") }   

Sin embargo, si cambié la línea var capitalCity: City! en let capitalCity: City!5 , el compilador ha dado a cabo la siguiente advertencia de error.

ingrese la descripción de la imagen aquí

Pregunta : ¿No es que podamos usar implícitamente sin envolver opcional cuando se puede definir una constante durante la inicialización? ¿Cuál es el error aquí? Si lo entiendo mal, aprecio que se podría señalar y ayudarme.

Original en ingles

By Drewag in his answer to the question

Every member constant must have a value by the time initialization is complete. Sometimes, a constant cannot be initialized with its correct value during initialization, but it can still be guaranteed to have a value before being accessed.

Using an Optional variable gets around this issue because an Optional is automatically initialized with nil and the value it will eventually contain will still be immutable. However, it can be a pain to be constantly unwrapping a variable that you know for sure is not nil. Implicitly Unwrapped Optionals achieve the same benefits as an Optional with the added benefit that one does not have to explicitly unwrap it everywhere.

The following code defines two classes, Country and City, each of which stores an instance of the other class as a property. Every country must have a capital city and every city must always belong to a country.

class Country {     let name: String     var capitalCity: City! //why I can't use let!     init(name: String, capitalName: String){         self.name = name         self.capitalCity = City(name: capitalName, country: self)     }          deinit {         print("\(name) has been de-initialized the city \(capitalCity.name) is gone with with the country")     }      }  class City{     let name: String     unowned let country: Country     init(name: String, country: Country){         self.name = name         self.country = country     }          deinit {         print("The city \(name) has been de-initialized ")     } }      var country = Country(name: "Canada", capitalName: "Ottawa") } 

However, if I changed the line var capitalCity: City! into let capitalCity: City!, the compiler given out the following error warning.

enter image description here

Question: Isn't that we can use Implicitly Unwrapped Optional when a constant that cannot be defined during initialization? What's the error here? If I understand it wrong I appreciate that you could point out and help me.

        
 
 

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

La parte importante es aquí:

  File -> Project Structure...2  

Definitivamente está usando File -> Project Structure...3 en la expresión que se ejecuta antes de la asignación a la propiedad File -> Project Structure...4 .

Si desea utilizar File -> Project Structure...5 en cualquiera de las expresiones, debe estar en la segunda fase de Inicialización de dos fases , lo que significa que todas las propiedades deben inicializarse antes de la Uso de File -> Project Structure...6 .

Con el uso de File -> Project Structure...7 , SWIFT asigna un valor inicial predeterminado File -> Project Structure...8 para la propiedad File -> Project Structure...9 . Por lo tanto, la propiedad puede ser considerada como "ya inicializada", por lo que puede usar Libraries0 después de haber inicializado otra propiedad Libraries1 .

(ya sabe dando Libraries2 a una constante de alquiler de Libraries3 es ridículo).

Por cierto Libraries4 se usa a menudo en casos similares:

  Libraries5  
 

The important part is here:

City(name: capitalName, country: self) 

You are definitely using self in the expression which is executed before the assignment to the property capitalCity.

If you want to use self in any of the expressions, it needs to be in the second phase of two phase initialization, which means all properties needs to be initialized before the usage of self.

With using var, Swift assigns a default initial value nil for the property capitalCity. So the property can be considered as "already initialized", so, you can use self after you have initialized another property name.

(You know giving nil to a let-constant of ImplicitlyUnwrappedOptional is ridiculous.)

By the way private(set) var is often used in similar cases:

    private(set) var capitalCity: City! 
 
 
 
 

Relacionados problema

0  Mostrar datos MYSQL seleccionados como <Select> Opción  ( Display selected mysql data as select option ) 
Después de buscar e intentar algunas cosas que no he tenido mucha suerte con este problema (probablemente simplemente). Estoy tratando de mostrar una lista ...

2  ¿Cómo elimino las opciones y mantengo una copia del original?  ( How do i delete options and maintain a copy of the original ) 
Tengo dos caídas, una que influye en la otra. Los primeros actos como filtro para el segundo. Ocultar getNumberImages()2 Opciones no funciona para IE8. Así ...

0  Opciones en Scala  ( Options in scala ) 
Estoy tratando de escribir una función que toma una lista de posiciones y una función (que toma una posición y produce y la ruta opcional) como argumentos. ...

1  Unener para configurar las opciones predeterminadas globales para los comandos UNIX / Linux: las mejores prácticas  ( One liner for setting global default options for unix linux commands best prac ) 
Ejecué constantemente el comando Ruby sudo gem install mygem1 con estas dos opciones en mi sistema de producción: sudo gem install mygem --no-ri --no-rdo...

30  Seleccione Caja con la primera opción vacía  ( Select box with first option empty ) 
¿Alguien sabe cómo puedo configurar mi casilla de selección la primera opción para vaciar el valor? Estoy recibiendo los datos de mi DB, y me gustaría confi...

0  Opciones de OpenCart - Cambio de tamaño de la imagen  ( Opencart options image resize ) 
Finalmente me estoy recuperando para clasificar mi sitio web después de varias jorobas grandes. Tengo un problema con el tamaño de la imagen. El código es e...

2  Opciones de SASS en rieles cuando se instala como una gema  ( Sass options in rails when installed as a gem ) 
Tengo HAML / SASS instalado como una gema y usándola con rieles. No puedo averiguar cómo pasar las opciones como template_location y style a SASS. Sass::...

1  La opción de Listbox se recorta cuando está en foco y desplazamiento  ( Listbox option is trimmed when in focus and scrolling ) 
Estoy tratando de construir un cuadro de lista que tenga un ancho más pequeño que la longitud de texto más larga. Al hacerlo, tengo una barra de desplazamient...

0  Opciones en productos durante el pago  ( Options on products during checkout ) 
Esencialmente, estoy buscando un módulo que me permita agregar opciones a ciertos productos que se muestran durante el pago y se pueden seleccionar si es nece...

2  Touch-Scroll Jquery Plugin - ¿Cómo iniciar con diferentes opciones para múltiples instancias?  ( Touch scroll jquery plugin how to init with different options for multiple ins ) 
Como se encuentra aquí - https://github.com/neave/touch-scroll : (function($) { // Define default scroll settings var defaults = { y: 0, scrollHe...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos