Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

267
Vistas
¿Por qué lanzar una estructura a AnyObject no es un error de compilación en Swift?

El siguiente código compila y funciona en Swift.

 struct TestStruct { let value: String = "asdf" } func iWantAReferenceType(object: AnyObject) { print(String(describing: object)) } let o: TestStruct = TestStruct() iWantAReferenceType(object: o as AnyObject)

Esperaba que esto fuera un error de compilación porque una estructura nunca puede ajustarse a AnyObject. Como se demuestra a continuación por el código que no se puede compilar.

 protocol Test: AnyObject { } //Compile error: because a struct cannot be AnyObject struct TestStruct: Test { let value: String = "asdf" }

Soy consciente de que pueden producirse algunos puentes para ciertos tipos, como String. Esto convertiría el tipo de valor de un tipo de referencia.

 print(Mirror(reflecting: "asdf").subjectType) //print: String print(Mirror(reflecting: "asdf" as AnyObject).subjectType) //print: NSTaggedPointerString

Al escribir esta pregunta, pensé en ver cuál era el tipo de objeto emitido y parece que también está conectado de alguna manera.

 print(Mirror(reflecting: o).subjectType) //prints: TestStruct print(Mirror(reflecting: o as AnyObject).subjectType) //prints: _SwiftValue

¿Por qué se permite este tipo de casting? Parece estar rompiendo el contrato de la función que espera un tipo de referencia.

Me topé con esto por accidente al refactorizar un código para admitir tipos de valor, para mi sorpresa, ya había estado funcionando para tipos de valor aunque pensé que no lo haría. ¿Es seguro confiar en este comportamiento?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Esta es una función para facilitar el paso a Cocoa. Cualquier estructura se puede envolver en un tipo de referencia SwiftValue . Si imprime el type(of: object) , verá el envoltorio.

No creo que haya ningún contrato para "esperar un tipo de referencia". Más importante aún, si bien existen "tipos de valor" y "tipos de referencia" en Swift, lo que realmente importa es la semántica de valor y referencia, que no se puede expresar en el lenguaje. Puede crear semántica de valor en tipos de referencia y semántica de referencia en tipos de valor, por lo que el sistema de tipo Swift realmente no es de ninguna ayuda en ese sentido.

El punto importante aquí es que solo obtiene este comportamiento inusual si lo solicita explícitamente as AnyObject . Hay muy pocas razones para escribir eso, y si es así, es mejor que sepa exactamente lo que está haciendo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda