Swift中動(dòng)態(tài)調(diào)用實(shí)例方法介紹
在 Swift 中有一類(lèi)很有意思的寫(xiě)法,可以讓我們不直接使用實(shí)例來(lái)調(diào)用這個(gè)實(shí)例上的方法,而是通過(guò)類(lèi)型取出這個(gè)類(lèi)型的某個(gè)實(shí)例方法的簽名,然后再通過(guò)傳遞實(shí)例來(lái)拿到實(shí)際需要調(diào)用的方法。比如我們有這樣的定義:
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
}
想要調(diào)用 method 方法的話,最普通的使用方式是生成MyClass的實(shí)例,然后用.method來(lái)調(diào)用它:
let object = MyClass()
let result = object.method(1)
// result = 2
這就限定了我們只能夠在編譯的時(shí)候就決定object實(shí)例和對(duì)應(yīng)的方法調(diào)用。其實(shí)我們還可以使用剛才說(shuō)到的方法,將上面的例子改寫(xiě)為:
let f = MyClass.method
let object = MyClass()
let result = f(object)(1)
這種語(yǔ)法看起來(lái)會(huì)比較奇怪,但是實(shí)際上并不復(fù)雜。Swift中可以直接用 Type.instanceMethod的語(yǔ)法來(lái)生成一個(gè)可以柯里化的方法。如果我們觀察 f 的類(lèi)型 (Alt + 單擊),可以知道它是:
f: MyClass -> (Int) -> Int
其實(shí)對(duì)于 Type.instanceMethod 這樣的取值語(yǔ)句,實(shí)際上剛才
let f = MyClass.method
做的事情是類(lèi)似于下面這樣的字面量轉(zhuǎn)換:
let f = { (obj: MyClass) in obj.method }
這下就不難理解為什么上面的調(diào)用方法可以成立了。
這種方法只適用于實(shí)例方法,對(duì)于屬性的 getter或者setter 是不能用類(lèi)似的寫(xiě)法的。另外,如果我們遇到有類(lèi)型方法的名字沖突時(shí):
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
class func method(number: Int) -> Int {
return number
}
}
如果不加改動(dòng),MyClass.method 將取到的是類(lèi)型方法,如果我們想要取實(shí)例方法的話,可以顯式地加上類(lèi)型聲明加以區(qū)別。這種方式不僅在這里有效,在其他大多數(shù)名字有歧義的情況下,都能很好地解決問(wèn)題:
let f1 = MyClass.method
// class func method 的版本
let f2: Int -> Int = MyClass.method
// 和 f1 相同
let f3: MyClass -> Int -> Int = MyClass.method
// func method 的柯里化版本
- 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法
- Swift的74個(gè)常用內(nèi)置函數(shù)介紹
- swift中的正則表達(dá)式小結(jié)
- 利用Swift如何判斷iPhone X機(jī)型詳解
- Swift之UITabBarController 導(dǎo)航控制器的自定義
- Swift教程之枚舉類(lèi)型詳解
- Swift中的可變參數(shù)函數(shù)介紹
- Swift在控件中添加點(diǎn)擊手勢(shì)的方法
- Swift流程控制之循環(huán)語(yǔ)句和判斷語(yǔ)句詳解
- 分享十條實(shí)用的Swift小提示
相關(guān)文章
Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解
這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運(yùn)行多個(gè)任務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解
這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Swift代碼自定義UIView實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Swift如何自定義UIView的實(shí)現(xiàn)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪2021-10-10
在?Swift?中編寫(xiě)Git?Hooks腳本的方法
在本例中,我使用了?commit-msg?鉤子,它能夠在當(dāng)前提交信息生效前修改此信息,鉤子由一個(gè)參數(shù)調(diào)用,該參數(shù)是指向包含用戶(hù)輸入的提交消息的文件的路徑,這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內(nèi)容,然后寫(xiě)回調(diào)用掛鉤的文件2022-06-06

