¿Acceder a los valores de CGRect directamente vs normalizarlos en Swift? ¿Las reglas de Objective-C siguen siendo válidas?

Esta pregunta está inspirada en el comentario de Andrew Carter sobre una pregunta previa sobre el nuevo inicializador de CGSize en Swift.

Los Apple Docs para CGGeometry dicen:

… sus aplicaciones deben evitar leer y escribir directamente los datos almacenados en la estructura de datos CGRect. En su lugar, use las funciones descritas aquí para manipular rectangularjs y recuperar sus características.

¿La recomendación de Apple de no acceder directamente a los datos en un CGRect sigue siendo válida con Swift? ¿Por qué debería CGRectGetMidX , CGRectGetWidth , etc. en lugar de acceder directamente a los valores de una estructura CGRect , cuando estas properties ahora están expuestas con la nueva extensión de Swift en CGRect ?

Considere un CGRect no estándar con un ancho y una altura negativos:

 var rect = CGRect(x: 0.0, y: 0.0, width: -10.0, height: -10.0) 

Este es un rectángulo válido de acuerdo con los documentos de Apple, ya que "un rectángulo con un origen de [0.0, 0.0] y un tamaño de [10.0, 10.0] es exactamente equivalente a un rectángulo con un origen de [10.0, 10.0] y un tamaño de [-10.0, -10.0] ".

Puede estandarizar este CGRect llamando al método henetworkingado CGRectStandardize línea como en Objective-C, o cualquiera de los nuevos methods proporcionados en la extensión Swift de CGRect :

 CGRectStandardize(rect) // {x -10 y -10 w 10 h 10} rect.standardized // {x -10 y -10 w 10 h 10} rect.standardizeInPlace() // {x -10 y -10 w 10 h 10} 

¡Pero espera! Esto cambiará la position de su rectángulo en el plano de coorderadas, no solo haciendo que su ancho y alto sean positivos, sino que haga que su origin negativo para reflejar la position inicial del rectángulo con su ancho y altura negativos.

Las funciones en línea de CGRectGet proporcionan una interfaz para normalizar un valor específico de su rect, sin cambiar su origen. Swift proporciona una extensión de CGRect para que pueda acceder directamente a los valores normalizados, en lugar de utilizar los methods henetworkingados de C proporcionados por CGGeometry :

 var rect = CGRect(x: 0.0, y: 0.0, width: -10.0, height: -10.0) rect.size.width // non-normalized, returns -10 CGRectGetWidth(rect) // bridged C function, normalized, returns 10 rect.width // new from Swift extension on CGRect, normalized, returns 10 

Las nuevas interfaces:

 extension CGRect { // ... public var width: CGFloat { get } public var height: CGFloat { get } public var minX: CGFloat { get } public var midX: CGFloat { get } public var maxX: CGFloat { get } public var minY: CGFloat { get } public var midY: CGFloat { get } public var maxY: CGFloat { get } // ... } 

Entonces la respuesta es sí, las mismas reglas para CGRect en Objective-C también se aplican en Swift. La única diferencia aquí es que Swift proporciona una extensión en algunas estructuras CGGeometry que le permiten alejarse de las viejas funciones C en línea puenteadas desde los encabezados CGGeometry .

En Swift 3, parece que CGRectGetWidth() se reemplaza por CGRect.width .

introduzca la descripción de la imagen aquí