2016-07-21 42 views
0

official document複製下面的代碼片段,它用於演示如何使用擴展將方法添加到現有類型。添加新的實例方法到示例代碼的示例代碼感到困惑

extension Int { 
    func repetitions(task:() -> Void) { 
     for _ in 0..<self { 
      task()//what's going on here? 
     } 
    } 
} 

3.repetitions { //why I don't have to call as `repetitions()` 
    print("Hello!") 
} 

問:問題是不是問怎麼extinsion EXTENS。我只是對這段代碼感到困惑,爲什麼它看起來像這樣?爲什麼在0123函數體內使用task()?它來自哪裏?爲線3.repetition爲什麼不把它寫成3.repetition()

非常感謝

+1

'task'是名一個函數:'task()'調用該函數 – matt

+0

@matt Q1:你的意思是像「print(」hello!「)」這樣的函數?Q2:它和裏面的task有什麼關係? ) - > Void)。非常感謝。 – SLN

+1

它是''task'。傳遞給這個函數的參數是一個函數,我們可以給我們的參數任何我們想要的名字,我們稱之爲'任務' – matt

回答

3

repetitions是接受它的參數的函數和函數多次調用一個函數。

要調用repetitions,我們可以說(注意,這是斯威夫特3):

func sayHi() { 
    print("Hello") 
} 
3.repetitions(task:sayHi) 

但是,爲什麼定義一個額外的名字sayHi?相反,我們可以使用匿名函數:

​​

但在這種情況下,我們被允許在該呼叫的括號省略到repetitions和使用語法:

3.repetitions{print("Hello")} 
1

爲什麼要用任務( )函數體內?

task參數定義爲一個閉合又名匿名函數:

task:() -> Void 

這表示該函數需要另一功能作爲一個參數,其中一個不帶任何參數和返回沒有值。

調用task()調用這是在通過該功能。

爲線3.repetition爲什麼不把它寫成3.repetition()

搜索 「追蹤閉包語法」。如果Swift函數的最後一個參數是閉包,則可以將它附加到()參數列表之外的呼叫。 或者換句話說,這是完全一樣的:

3.repetitions(task: { 
    print("Hello!") 
}) 

(你是否有使用task:作爲關鍵字參數取決於您是否使用SWIFT 2或3