2016-06-22 46 views
0

這裏使用的代碼來自Swift Official Document如果一個常量變量是一種函數類型,那麼什麼是不能改變的?

func makeIncrementer(forIncrement amount: Int) ->() -> Int { 
    var runningTotal = 0 

    func incrementer() -> Int { 
     runningTotal += amount 
     return runningTotal 
    } 
    return incrementer 
} 

// what is the different with "var incrementByTen" 
let incrementByTen = makeIncrementer(forIncrement: 10) 

// why there is a "()" ajacent to the variable name? 
incrementByTen() 

可變incrementByTen分配由與makeIncrementer返回的功能了10

問題的爭論1.有什麼型動物時increemtnByTen是分配給一個變量而不是常量?既然這是恆定的,哪一部分是不可改變的?

問題2.爲什麼調用時使用括號對「()」與變量名稱,我知道這可能是一個函數初始值設定工作人員。但incrementByTen是一個常數名稱。它是否等於它指向的功能?或者這只是一種編程語言的一般特徵。當你想使用一個函數類型的變量/常量時,你必須使用「()」和名字。

+0

提示返回Int值:什麼類型的返回功能' makeIncrementer'? –

+0

@ShadowOf'makeIncrementer'函數返回一個函數類型'() - > Int'。但字符串'makeIncrementer'是一個函數名稱,它使用'()'。但字符串'incrementByTen'是一個變量名,它如何與'()'一起使用? – SLN

+1

當你在變量中有函數時,你需要有辦法執行這個函數,對吧?這是方式。 –

回答

3

可變incrementByTen被分配功能

這是一切的關鍵。 incrementByTen的值是一個函數。

如果incrementByTen是一個var變量,那麼它可以被重新分配給其他函數。由於它是一個let變量,它是一個常量函數。這與Int類型的varlet變量完全相同。整數值和函數值之間沒有深刻的區別。他們只是價值觀。

括號表示「調用函數」。 incrementByTen不是調用函數的結果;它是功能本身。這是一個價值。當評估該值時,它返回一個函數。然後您可以使用()運算符調用該函數。

這是完全等同於:

makeIncrementer(forIncrement: 10)() 

makeIncrementer(forIncrement: 10)返回功能,()調用該函數。這是類似於:

let x = thingThatReturnsInt() 
x + 10 

在這種情況下,xInt,我們可以將運營商+它。 makeIncrementer恰好會返回() -> Int而不是Int

+0

很好的解釋 –

+0

@Rob Napier非常感謝。這個解釋回答了我對這個問題的所有疑惑。 – SLN

1
  1. 使用var也會工作,但被認爲是不好的做法,除非您需要修改該變量。

  2. incrementByTen是類型() -> Int的函數,因爲函數makeIncrementer返回另一個函數。

+0

1.不解釋差異2.不說明作用'()' – Alexander

1
  1. let incrementByTen = makeIncrementer(forIncrement: 10)不會讓你那麼做:incrementByTen = makeIncrementer(forIncrement: 42)。除非更改爲var,否則不能將新閉包重新分配給該變量。

  2. incrementByTen是封閉類型(() -> Int,具體而言)。 ()在沒有任何爭論的情況下調用閉包。換句話說,incrementByTen是蓋子本身(打印時,它將顯示"(Function)"),而incrementByTen()是通過調用封閉件(打印時,它將顯示10

+0

嗯。 'let'只能將該值綁定到該函數。一旦分配它就不能改變。謝謝你的解釋 – SLN

相關問題