Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

266
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!