有没有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 的变量。
在 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 的变量。