Swift: CGRect, CGSize & CGPoint

eres (probablemente) haciendo mal

Andyy Esperanza
Andyy Esperanza

Seguir

2 de Febrero, 2016 · 4 min de lectura

ha sido alrededor de un sólido ocho meses desde que decidí saltar por completo en el Swift agujero de gusano. Durante esos meses he aprendido lentamente a dejar de escribir patrones de código de estilo Objective-C con sintaxis Swift, y empecé a aprovechar el nuevo lenguaje.

Pero una cosa que he aprendido recientemente es que todavía estoy usando una sintaxis fea no similar a Swift con todas mis estructuras CGGeometry.

CGRect, CGSize, CGPoint

C sintaxis. Una oveja con ropa de lobo

Tengo la gran sensación de que muchos desarrolladores de Swift van a ser culpables de esto. Levante la mano si ha estado usando cualquiera de estos en su código:

let rect = CGRectMake(0, 0, 100, 100)let point = CGPointMake(0, 0)let size = CGSizeMake(100, 100)

Actualización: a partir de Swift 3, estas funciones han sido eliminados.

Sí, eso pensé. Pero no te preocupes, no es nada de lo que avergonzarse yet todavía.

Lo que está mal con esto es que rompe la convención de codificación de Swift, seguirá funcionando, pero se parece mucho más a algo que si pertenece a Objective-C o incluso, me atrevo a decirlo, Java. * estremecimientos *

Para un desarrollador experimentado de iOS o OSX, con un vistazo corto podrían decirle fácilmente lo que está haciendo ese código. No necesitan etiquetas de argumento en estructuras CGGeometry porque todos conocen esos argumentos y su secuencia de memoria. Excepto que no lo hacen.

Mucho de lo que se trata Swift es ser amigable con los recién llegados al lenguaje, así como con los principiantes de programación completos. Si miraran ese código, no tendrían idea de lo que representan esos números. Así que prometamos ser buenos ciudadanos de Swift y comencemos a usar las versiones de Swift:

let rect = CGRect(x: 0, y: 0, width: 100, height: 100)let size = CGSize(width: 100, height: 100)let point = CGPoint(x: 0, y: 0)

Para una sintaxis un poco extra, la verbosidad de nuestro código es completamente comprensible a primera vista. Además, una ventaja añadida de utilizar la etiqueta CGGeometry struct inicializador es que ahora no son sólo para el uso de CGFloat como argumentos, también se puede pasar Int y Double!

Zero

let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero

Actualización: A partir de Swift 3, estas funciones se han eliminado.

Mientras estamos en ello, es probable que todavía estés usando estos también, amirite? lel.

También deberíamos actualizarlos para usar la sintaxis más nueva y rápida. Pero no se preocupe, la sintaxis es solo un carácter adicional más largo. ¿Puedes adivinar qué es?

let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero

Otra cosa para que te sumes a esto es que el resaltador de sintaxis de Xcode, dependiendo de tu combinación de colores, resaltará el .zero, haciéndolo un poco más ligero en tu carga cognitiva.

Recuperación de valores

CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)

Actualización: A partir de Swift 3, estas funciones se han eliminado.

Si eras o sigues siendo un buen ciudadano de Objective-C, habrías usado estos captadores de valores cuando querías un valor específico del rect. Pero espera un segundo, ¿por qué no accedemos a los valores directamente?

CGFloat width = frame.size.widthCGFloat height = frame.size.height

Por esta razón, sus aplicaciones deben evitar leer y escribir directamente los datos almacenados en la estructura de datos CGRect. En su lugar, utilice las funciones descritas aquí para manipular rectángulos y recuperar sus características.

— Apple, Documentación de referencia de CGGeometry

Probablemente todavía haya muchos de ustedes que no se molestaron con tales formalidades, pero está bien. Swift nos ha aliviado de una API tan sencilla y, en su lugar, nos ha proporcionado variables de notación de puntos simples.

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY

Hay muchos más ejemplos de estas sutilezas disponibles en Swift playgrounds que he proporcionado para complementar esta publicación. El enlace estará en la parte inferior de la página.

Mutabilidad

let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10

No solo puede cambiar los valores individuales del marco de una vista, sino que también puede reemplazar completamente subestructuras completas. He aquí:

let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)

Esta pequeña característica por sí sola es una razón suficiente para dejar de usar Objective-C. Mutabilidad en CGRects sin tener que crear uno nuevo por completo y restablecer el valor. Fue hace menos de dos años que nosotros, como desarrolladores de Objective-C, nos vimos obligados a escribir código de modificación de fotogramas como este:

CGRect frame = CGRectMake(0, 0, 100, 100);UIView *view = initWithFrame: frame];CGRect newFrame = view.frame;newFrame.size.width = view.frame.origin.x + 10;view.frame = newFrame;

No se sobre ti, pero escribir eso realmente me estresó. Crear una estructura newFrame desde el marco de view, modificarla y, a continuación, restablecer la propiedad frame en el view de nuevo. No, gracias, nunca, nunca más, por favor.

No olvides

También hay un par de otras construcciones dentro de UIKit para las que estos cambios son aplicables:

UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10

Deja una respuesta

Tu dirección de correo electrónico no será publicada.