Swift中靜態挪用實例辦法引見。本站提示廣大學習愛好者:(Swift中靜態挪用實例辦法引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift中靜態挪用實例辦法引見正文
在 Swift 中有一類很成心思的寫法,可讓我們不直接應用實例來挪用這個實例上的辦法,而是經由過程類型掏出這個類型的某個實例辦法的簽名,然後再經由過程傳遞實例來拿到現實須要挪用的辦法。好比我們有如許的界說:
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
}
想要挪用 method 辦法的話,最通俗的應用方法是生成MyClass的實例,然後用.method來挪用它:
let object = MyClass()
let result = object.method(1)
// result = 2
這就限制了我們只可以或許在編譯的時刻就決議object實例和對應的辦法挪用。其實我們還可使用適才說到的辦法,將下面的例子改寫為:
let f = MyClass.method
let object = MyClass()
let result = f(object)(1)
這類語法看起來會比擬奇異,然則現實上其實不龐雜。Swift中可以直接用 Type.instanceMethod的語法來生成一個可以柯裡化的辦法。假如我們不雅察 f 的類型 (Alt + 單擊),可以曉得它是:
f: MyClass -> (Int) -> Int
其實關於 Type.instanceMethod 如許的取值語句,現實上適才
let f = MyClass.method
做的工作是相似於上面如許的字面量轉換:
let f = { (obj: MyClass) in obj.method }
這下就不難懂得為何下面的挪用辦法可以成立了。
這類辦法只實用於實例辦法,關於屬性的 getter或許setter 是不克不及用相似的寫法的。別的,假如我們碰到有類型辦法的名字抵觸時:
class MyClass {
func method(number: Int) -> Int {
return number + 1
}
class func method(number: Int) -> Int {
return number
}
}
假如不加修改,MyClass.method 將取到的是類型辦法,假如我們想要取實例辦法的話,可以顯式地加上類型聲明加以差別。這類方法不只在這裡有用,在其他年夜多半名字有歧義的情形下,都能很好地處理成績:
let f1 = MyClass.method
// class func method 的版本
let f2: Int -> Int = MyClass.method
// 和 f1 雷同
let f3: MyClass -> Int -> Int = MyClass.method
// func method 的柯裡化版本