前言
最近在研究GPUImage3代碼,看到如下這一段代碼
infix operator --> : AdditionPrecedence
//precedencegroup ProcessingOperationPrecedence {
// associativity: left
//// higherThan: Multiplicative
//}
@discardableResult public func --><T:ImageConsumer>(source:ImageSource, destination:T) -> T {
source.addTarget(destination)
return destination
}
上面的代碼自定義了一個(gè)運(yùn)算符 --> 這個(gè)運(yùn)算符需要兩個(gè)操作數(shù),優(yōu)先級(jí)與+和-一樣据块,該操作符使用的代碼
camera --> operation --> renderView
它與GPUImage中addTarget:方法效果一樣拓售。
在學(xué)習(xí)過程中發(fā)現(xiàn)GPUImage3的代碼比GPUImage的代碼簡潔很多,這里不得不為Swift的簡潔特性點(diǎn)贊绪囱。下面就來看看Swift中自定義操作符的語法規(guī)則
自定義運(yùn)算符的語法
1测蹲、infix|prefix|postfix operator 運(yùn)算符 : 優(yōu)先級(jí)描述符
2、func 運(yùn)算符() -> 返回值 {} 定義該運(yùn)算符的函數(shù)功能
這兩個(gè)步驟缺一不可,接下來逐個(gè)解釋:
infix|prefix|postfix
代表了操作符的個(gè)數(shù);infix為需要兩個(gè)操作符鬼吵,prefix代表左操作符(類似++a) postfix代表右操作符(類似a++)
operator
關(guān)鍵字 重載
運(yùn)算符
要定義的自定義運(yùn)算符扣甲,例如上面的-->
:
這里的冒號(hào)不可少
優(yōu)先級(jí)描述符
代表了該運(yùn)算符的優(yōu)先級(jí),可以使用系統(tǒng)內(nèi)置的優(yōu)先級(jí)描述符例如AdditionPrecedence(和加減法優(yōu)先級(jí)一樣)齿椅、MultiplicationPrecedence(和乘除法優(yōu)先級(jí)一樣)琉挖,也可以使用自定義的優(yōu)先級(jí)描述符,自定義語法如下:
precedencegroup InnerProductPrecedence {
associativity: none
higherThan: MultiplicationPrecedence, AdditionPrecedence
}
precedencegroup:自定義優(yōu)先級(jí)的關(guān)鍵字
InnerProductPrecedence:自定義優(yōu)先級(jí)名
associativity:是否允許結(jié)合律涣脚,可取值為none示辈、left。none代表只允許兩個(gè)操作數(shù)計(jì)算遣蚀,left代表如果多個(gè)同類的操作符順序出現(xiàn)那么按照從左往右的順序計(jì)算(例如加法,減法)
higherThan:代表其優(yōu)先級(jí)要高于某個(gè)優(yōu)先級(jí)
然后就是通過func 關(guān)鍵字定義該操作數(shù)的函數(shù)功能