有没有shorthand的方法来写CGPoint、CGRect等?

Is there any shorthand way to write CGPoint, CGRect, etc?

在 Swift 3.0 中,我们现在声明 CGPoints 如下:

CGPoint(x: 1.0, y: 0.0)

这,嗯...有点冗长。当您编写一个以 CGPoint 作为参数的函数时,事情会很快变得丑陋:

myObject.callMyFunc(someVar: 1, point1: CGPoint(x: 1.0, y: 0.0), point2: CGPoint(x: 1.0, y: 2.0))

CGPoint 和 CGRect 等结构体有 shorthand 吗?

正如评论中已经建议的那样,您可以创建自己的扩展程序。

扩展

您可以添加接受 2 CGFloat(s) 并且不需要外部参数名称的初始化程序

extension CGPoint {
    init(_ x: CGFloat, _ y: CGFloat) {
        self.x = x
        self.y = y
    }
}

let point = CGPoint(1, 2)

中缀运算符

您还可以定义中缀运算符

infix operator ° {}
func °(x: CGFloat, y: CGFloat) -> CGPoint {
    return CGPoint(x: x, y: y)
}

let point = 1.1 ° 1.1

您可以将 CGPoint 扩展到 ExpressibleByArrayLiteral 协议,然后您可以使用数组文字来初始化 CGPoint:

view.center = [10, 20]

代码:

extension CGPoint: ExpressibleByArrayLiteral {
    public init(arrayLiteral elements: CGFloat...) {
        assert(elements.count == 2)
        self.init(x: elements[0], y: elements[1])
    }
}

你应该处理好数组的元素个数,编译器不会帮你检查的。尽管这种方法破坏了编译安全,但它是一种使用起来非常方便的方法。

已经有一个库 (Literal) 为您实现了这个。它已经处理了一些失败的情况,比如将单元素数组传递给需要 CGPoint 的变量。