2016-10-14 61 views
0

我在文字中做了很多定位和動畫的東西,他們佔用了很多空間,並且由於冗長而變得不可讀。如何爲CGPoint和CGVector創建簡稱?

我想要做的就是把這個

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

進入這個:

var xy = •(100, 100) 

同樣,我想從去:

CGVector(dx: 200, dy: 200) 

到這樣的事情:

`(200, 200) 

但我不知道怎麼一個類似於宏速記或類似這樣的東西會做,或者即使可以這樣做。任何指針(puntendered)都會比我所在的位置更好。

我知道這對大多數人來說可能不太可讀。

由於上下文我總是知道這些是什麼。我不需要參數標籤或函數名來理解我在做什麼。這是私人動畫和動作測試,沒有必要讓其他人瞭解發生了什麼。

+2

也許[this](http://stackoverflow.com/questions/38629575/is-there-any-shorthand-way-to-write-cgpoint-cgrect-etc)可以提供幫助。具體看看我的答案中的「Infix Operator」段落。 –

+3

你可以做到這一點,但你不應該這樣做。 – holex

+1

@appzYourLife非常有趣,在文檔中引導我這樣做:「您不限於預定義的操作符。Swift使您可以自由定義自定義中綴,前綴,後綴和賦值運算符,並具有自定義優先級和關聯性這些運算符可以像任何預定義的運算符一樣在代碼中使用和採用,甚至可以擴展現有類型以支持您定義的自定義運算符。「 ----但我不明白如何做前綴運算符,這可能是完美的,或者我可能是錯的。 – Confused

回答

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

對於這種類型的事情,你可能會使用typealias,但我認爲你不能創建名稱爲操作符或符號的類型。

請參閱下文,我爲CGPoint創建了CGP的typeAlias,如果您願意,您可以簡單地將它別名爲Point。

enter image description here

下面是從docs

一些信息類型別名聲明引入現有類型的命名別名到你的程序。類型別名聲明使用typealias關鍵字聲明,並具有以下形式:

typealias名=現有類型

一個類型別名聲明後,別名名稱可以代替任何地方使用的現有類型的在你的程序。現有類型可以是命名類型或複合類型。類型別名不會創建新類型;他們只是允許一個名稱來引用一個現有的類型。

編輯不包括參數名

兩個簡單的方法:

func cp(_ x: Int, _ y: Int) -> CGPoint { 
    return CGPoint(x: x, y: y) 
} 

let point = cp(0,2) 


extension CGPoint { 

    init(_ x: Int, _ y: Int) { 
     self.init(x: x, y: y) 
    } 
} 

typealias CGP = CGPoint 

let point2 = CGP(1,1) 

第一種方法只是創建使用它的設計intialiser返回一個CGPoint的輔助功能。第二個選項是這樣做的更好的方法,您擴展CGPoint並添加標記PARAMS非名爲PARAMS的初始化程序(通過使用_代替外部名)

+0

這非常酷。我可以看到其他用途,遠遠超出這個問題。我可以用這種別名技術擺脫參數標籤嗎? – Confused

+1

查看更新回答 – Scriptable

+0

哇。謝謝!你的第一個創建功能的方法,就是純粹,簡單的天才。這從來沒有發生過。這種方法有很多開銷嗎?想象一下,每一幀都會發生100次。 – Confused

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 
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),這是足夠好的,在我看來。

+0

並且請提交一份Apple告訴他們的錯誤廢除「CGRectMake」,「CGPointMake」等是錯誤的!我無法想象他們在想什麼。 – matt

+0

哈!再次證明,騎自行車的人都有幽默感! – Confused