国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

Swift中動態調用實例方法介紹

2020-03-09 17:51:36
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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 的柯里化版本



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 赣榆县| 海丰县| 林芝县| 中牟县| 改则县| 新竹市| 城步| 休宁县| 方城县| 凤庆县| 江永县| 启东市| 白水县| 根河市| 东安县| 吉木萨尔县| 独山县| 土默特左旗| 榕江县| 镇平县| 南昌市| 浦城县| 菏泽市| 巴东县| 海丰县| 高淳县| 大连市| 平和县| 旌德县| 石楼县| 雷山县| 津南区| 嘉黎县| 太谷县| 贵阳市| 当涂县| 沂南县| 梁山县| 蒙城县| 子长县| 万年县|