有没有写CGPoint,CGRect等的简写方法?

时间:2016-07-28 07:19:50

标签: swift swift3

使用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这样的结构的简写?

2 个答案:

答案 0 :(得分:7)

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

扩展

您可以添加一个接受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

答案 1 :(得分:3)

您可以将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])
    }
}

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

已经有一个lib(Literal)为您实现此功能。它处理了一些下降情况,比如将一个元素数组传递给CGPoint所需的变量。