variable strong protocol generic extension apple ios swift struct any anyobject

ios - strong - AnyObject vs. Struct(Cualquiera)



swift syntax (4)

Me gustaría crear un método como este para mis proyectos:

func print(obj: AnyObject) { if let rect = obj as? CGRect { println(NSStringFromCGRect(rect)) } else if let size = obj as? CGSize { println(NSStringFromCGSize(size)) } //... }

Pero no puedo porque CGRect y CGSize son struct y no se ajustan al protocol AnyObject . Entonces, ¿alguna idea sobre cómo esto podría hacerse?


Acabo de descubrir un método mucho mejor para hacer esto. Swift tiene un método llamado volcado , y funciona con muchos tipos de datos.

Por ejemplo:

dump(CGRectMake(0, 5, 30, 60))

Se imprimirá:

{x 0 y 5 w 30 h 60}


La respuesta de @nkukushkin es correcta, sin embargo, si lo que quiere es una función que se comporte de manera diferente dependiendo de si ha pasado un CGRect o un CGStruct , le CGStruct más la sobrecarga:

func print(rect: CGRect) { println(NSStringFromCGRect(rect)) } func print(size: CGSize) { println(NSStringFromCGSize(size)) }

En comparación, el Any será ineficiente (convertir tus estructuras en Any y viceversa, podría tener un gran impacto si haces esto mucho en un ciclo cerrado) y no seguro (puedes pasar cualquier cosa a esa función, y solo fallará en el tiempo de ejecución).

Si su intención es obligar a ambos tipos a un tipo común y luego hacer la misma operación en él, puede crear una tercera sobrecarga que tome ese tipo, y hacer que los otros dos lo llamen.


Si solo necesita imprimir un CGRect o CGSize , podría usar:

println(rect)

o

println(size)

Dejó un ''...'' al final de su función, así que supongo que hay más tipos que necesita imprimir. Para hacer eso, necesitas hacer que esos tipos se ajusten al protocolo Printable (a menos que ya lo hagan). Aquí hay un ejemplo de cómo:

class Car { var mileage = 0 } extension Car : Printable { var description: String { return "A car that has travelled /(mileage) miles." } }

El que puedes usar:

let myCar = Car() println(myCar)

Además, es posible que desee cambiar el formato de la forma en que se imprime actualmente un tipo. Por ejemplo, si quiere println(aRect) en el mismo formato que NSStringFromCGRect , puede usar la extensión:

extension CGRect : Printable { public var description: String { return "{/(origin.x), /(origin.y)}, {/(size.width), /(size.height)}" } }


Use Any lugar de AnyObject .

Swift proporciona dos alias de tipo especial para trabajar con tipos no específicos:

AnyObject puede representar una instancia de cualquier tipo de clase.
Any puede representar una instancia de cualquier tipo, incluidos los tipos de funciones.

El lenguaje de programación Swift