直接访问CGRect值与在Swift-Objective-C规则中规范化仍然有效?

这个问题受到了Andrew Carter对Swift中有关新的CGSize初始化器问题的评论 。

CGGeometry的Apple Docs说:

…您的应用程序应避免直接读取和写入CGRect数据结构中存储的数据。 相反,使用这里描述的function来操纵矩形并检索它们的特征。

苹果公司build议不要直接访问CGRect的数据,这些数据仍然适用于Swift吗? 为什么应该使用CGRectGetMidXCGRectGetWidth等来代替直接访问CGRect结构的值,当这些属性现在暴露在Swift的CGRect上的新扩展?

考虑一个具有负宽度和高度的非标准CGRect

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

根据Apple文档,这是一个有效的矩形,因为“原点为[0.0, 0.0] ,尺寸为[10.0, 10.0]的矩形完全等同于原点为[10.0, 10.0]的矩形和大小[-10.0, -10.0]

您可以通过调用像Objective-C中的传统内联CGRectStandardize方法或CGRect的Swift扩展中提供的任何新方法来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} 

可是等等! 这将在坐标平面上重新定位您的矩形,不仅使您的宽度和高度为正值,而且使您的origin负,以反映矩形的初始位置及其负宽度和高度。

内联CGRectGet函数提供了一个接口来规范你的矩形的一个特定值,而不改变其原点。 Swift在CGRect上提供了一个扩展,所以你可以直接访问规范化的值,而不是使用CGGeometry提供的传统C方法:

 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 

新的界面:

 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 } // ... } 

所以答案是肯定的,Objective-C中CGRect规则也适用于Swift。 这里唯一的区别是Swift在一些CGGeometry结构上提供了一个扩展,它允许你从CGGeometry头部桥接的旧的内联C函数CGGeometry

在Swift 3中,它看起来像CGRectGetWidth()CGRect.width所取代。

在这里输入图像说明