如何为CGPoint& amp;创建缩写CGVector?

时间:2016-10-14 14:01:47

标签: swift

我在文字中做了大量的定位和动画制作,而且由于冗长,他们占用了大量空间并变得难以理解。

我想做的就是转

    var xy = CGPoint(x: 100, y: 100)

进入这个:

    var xy = •(100, 100)

同样,我想来自:

    CGVector(dx: 200, dy: 200)

这样的事情:

    `(200, 200)

但我不知道如何做一个类似宏的速记或类似的东西,或者即使它可以完成。任何指针(被踩踏)都会比我在哪里好。

我认为这对大多数人来说可能性较差。

由于上下文,我总是知道它们是什么。我不需要参数标签或功能名称来理解我在做什么。这是私人动画和动作测试,没有其他人能够理解正在发生的事情。

4 个答案:

答案 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。

enter image description here

以下是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)之类的东西,而且我觉得这还不错。