Swift中動態(tài)調(diào)用實(shí)例方法介紹
在 Swift 中有一類很有意思的寫法,可以讓我們不直接使用實(shí)例來調(diào)用這個實(shí)例上的方法,而是通過類型取出這個類型的某個實(shí)例方法的簽名,然后再通過傳遞實(shí)例來拿到實(shí)際需要調(diào)用的方法。比如我們有這樣的定義:
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
}
想要調(diào)用 method 方法的話,最普通的使用方式是生成MyClass的實(shí)例,然后用.method來調(diào)用它:
let object = MyClass()
let result = object.method(1)
// result = 2
這就限定了我們只能夠在編譯的時候就決定object實(shí)例和對應(yīng)的方法調(diào)用。其實(shí)我們還可以使用剛才說到的方法,將上面的例子改寫為:
let f = MyClass.method
let object = MyClass()
let result = f(object)(1)
這種語法看起來會比較奇怪,但是實(shí)際上并不復(fù)雜。Swift中可以直接用 Type.instanceMethod的語法來生成一個可以柯里化的方法。如果我們觀察 f 的類型 (Alt + 單擊),可以知道它是:
f: MyClass -> (Int) -> Int
其實(shí)對于 Type.instanceMethod 這樣的取值語句,實(shí)際上剛才
let f = MyClass.method
做的事情是類似于下面這樣的字面量轉(zhuǎn)換:
let f = { (obj: MyClass) in obj.method }
這下就不難理解為什么上面的調(diào)用方法可以成立了。
這種方法只適用于實(shí)例方法,對于屬性的 getter或者setter 是不能用類似的寫法的。另外,如果我們遇到有類型方法的名字沖突時:
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
class func method(number: Int) -> Int {
return number
}
}
如果不加改動,MyClass.method 將取到的是類型方法,如果我們想要取實(shí)例方法的話,可以顯式地加上類型聲明加以區(qū)別。這種方式不僅在這里有效,在其他大多數(shù)名字有歧義的情況下,都能很好地解決問題:
let f1 = MyClass.method
// class func method 的版本
let f2: Int -> Int = MyClass.method
// 和 f1 相同
let f3: MyClass -> Int -> Int = MyClass.method
// func method 的柯里化版本
相關(guān)文章
在Swift中使用Objective-C編寫類、繼承Objective-C類
這篇文章主要介紹了在Swift中使用Objective-C編寫類、繼承Objective-C類等操作方法介紹,需要的朋友可以參考下2014-07-07深入解析Swift中switch語句對case的數(shù)據(jù)類型匹配的支持
這篇文章主要介紹了Swift中switch語句對case的數(shù)據(jù)類型匹配的支持,Swift中switch...case語句支持多種數(shù)據(jù)類型的匹配判斷,十分強(qiáng)大,需要的朋友可以參考下2016-04-04Swift項目中利用SWRevealViewController實(shí)現(xiàn)側(cè)滑菜單
這篇文章主要介紹了Swift項目中利用SWRevealViewController實(shí)現(xiàn)側(cè)滑菜單,需要的朋友可以參考下2015-12-12Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue
這篇文章主要介紹了Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下2016-12-12