我在文字中做了大量的定位和动画制作,而且由于冗长,他们占用了大量空间并变得难以理解。
我想做的就是转
var xy = CGPoint(x: 100, y: 100)
进入这个:
var xy = •(100, 100)
同样,我想来自:
CGVector(dx: 200, dy: 200)
这样的事情:
`(200, 200)
但我不知道如何做一个类似宏的速记或类似的东西,或者即使它可以完成。任何指针(被踩踏)都会比我在哪里好。
我认为这对大多数人来说可能性较差。
由于上下文,我总是知道它们是什么。我不需要参数标签或功能名称来理解我在做什么。这是私人动画和动作测试,没有其他人能够理解正在发生的事情。
答案 0 :(得分:2)
extension CGPoint {
init(_ x: CGFloat, _ y: CGFloat) {
self.init(x: x, y: y)
}
}
extension CGVector {
init(_ dx: CGFloat, _ dy: CGFloat) {
self.init(dx: dx, dy: dy)
}
}
typealias P = CGPoint
typealias V = CGVector
let p = P(10, 10)
let v = V(10, 10)
但不知道•和`部分 - 我用P和V替换它们:)
答案 1 :(得分:1)
对于这类事情,您可能会使用wrap
,但我认为您无法创建名称为运算符或符号的类型。
见下文,我为CGPoint创建了一个typealias
的CGP,如果你愿意,你可以简单地将它别名为Point。
以下是docs
中的一些信息类型别名声明将现有类型的命名别名引入程序。类型别名声明使用typealias关键字声明,并具有以下形式:
typealias name =现有类型
声明类型别名后,可以在程序中的任何位置使用别名来代替现有类型。现有类型可以是命名类型或复合类型。类型别名不会创建新类型;它们只是允许名称引用现有类型。
修改的
排除参数名称的两种简单方法:
typeAlias
第一种方法只是创建一个辅助函数,它使用它设计的intialiser返回一个CGPoint。第二个选项是更好的方法,你扩展CGPoint并添加一个初始化器,将params标记为非命名参数(通过使用_而不是外部名称)
答案 2 :(得分:1)
您无法使用特殊字符,因为编译器无法区分函数名称和' *'等操作符。
使用typealias
使用typealias可以缩短函数名称,但不会省略问题中列出的参数名称。
typealias p = CGPoint
//example
let p1 = p(x: 60, y: 60)
使用匿名参数
func p(_ x: CGFloat, _ y: CGFloat) -> CGPoint {
return CGPoint(x: x,y: y)
}
//example
let p1 = p(60, 60) //no parameter names
答案 3 :(得分:1)
我也想摆脱参数标签,但我不建议减少任何简短的速记。我将此代码粘贴到所有我的应用项目的开头:
extension CGRect {
init(_ x:CGFloat, _ y:CGFloat, _ w:CGFloat, _ h:CGFloat) {
self.init(x:x, y:y, width:w, height:h)
}
}
extension CGSize {
init(_ width:CGFloat, _ height:CGFloat) {
self.init(width:width, height:height)
}
}
extension CGPoint {
init(_ x:CGFloat, _ y:CGFloat) {
self.init(x:x, y:y)
}
}
extension CGVector {
init (_ dx:CGFloat, _ dy:CGFloat) {
self.init(dx:dx, dy:dy)
}
}
这让我可以说CGPoint(1,4)
之类的东西,而且我觉得这还不错。