[转]Swift 范的 CGRect、CGSize 和 CGPoint

C 语法 —— 披着羊皮的狼

我相信下面这种写法,很多 Swift 开发者都会中枪

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

这样写是不对的,它很不 Swift 范。虽然它并不影响程序本身,但是它看起来更有点 Objective-C 范,或者… Java 范。
iOS 或 OS X 开发者能轻易说出这段代码的含义。
Swift 在很多方面对初学者都很友好,无论你是刚接触 Swift,还是刚接触编程。如果让初学者看上面的代码,他可能完全不知道那些数字的含义。所以,让我们来看看正确的 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)

每个参数前面都有了参数描述,这一点描述,就已经能让我们在第一眼明白代码含义了。除此之外,这种 CGGeometry 结构体构造器还有一个好处:传入的参数不仅可以是 CGFloat 类型,也可以是 IntDouble

Zero

let rect  = CGRectZero
let size  = CGSizeZero
let point = CGPointZero

看上面这段代码,你很有可能还在这样写,对吧?
我们也应该将这种写法替换成 Swift 风格。别怕,只是多了一个字符而已。你能猜到怎么写吗?

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

这样写代码也更为清晰,Xcode 会将 . 前后部分分开高亮,.zero 会更亮一点(当然这取决于你的 Xcode 主题)。

取值

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

如果你依然是个合格的 Objective-C 公民,那么你会采用以上方式去取 rect 中特定的值。但是…为什么我们不直接去访问这个变量呢?

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

Swift 提供了简单的点语法访问来取代之前不那么完美的 API。

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

可变

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

现在,你不仅可以直接修改 frame 中某一个变量的值,并且你也可以直接对 frame 包含的 origin 与 size 结构体重新赋值:

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

文章代码可在 GitHub 上找到。

转自:Swift 范的 CGRect、CGSize 和 CGPoint

你可能感兴趣的:([转]Swift 范的 CGRect、CGSize 和 CGPoint)