使用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这样的结构的简写?
答案 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所需的变量。