2015-02-07 82 views
-4

我遇到此代碼並不確定它如何執行諸如(*,+, - ,%)等操作。有人可以解釋它是如何知道例如必須添加這兩個數字嗎?快速幫助,請解釋此代碼的工作原理

var operandStack = Array<Double>() 

switch operation { 
     case "×": performOperation { $0 * $1 } 
     case "+": performOperation { $0 + $1 } 


func performOperation(operation: (Double, Double)->Double) 
{ 
    displayValue=operation(operandStack.removeLast(), 
    operandStack.removeLast()) 
} 

var displayValue: Double 
{ 
    set { 
     display.text = "\(newValue)" 
    } 
    get { 
     return NSNumberFormatter().numberFromString 
             (display.text!)!.doubleValue 
    } 
} 

回答

2

在夫特,表達

{ $0 * $1 } 

是一個函數(技術上closure expression),其通過它的第二相乘的第一個參數。參數從零開始編號。

該功能與(Double, Double)->Double(注意類型推斷的力量)兼容,因此可以傳遞給performOperation

下面是從斯威夫特開發指南一些更多的信息:

速記參數名

雨燕自動提供速記參數名內聯閉包,它可以用來指封閉的值參數名稱爲$ 0,$ 1,$ 2等。

如果在閉包表達式中使用這些簡寫參數名稱,則可以從其定義中省略閉包的參數列表,並且可以從期望的函數類型中推斷簡寫參數名稱的數量和類型。中的關鍵字,也可省略的,因爲封閉件表達是由完全其身體的:

反轉=排序(姓名,{$ 0> $ 1})

在這裏,$ 0和$ 1參見封閉件的第一和第二個String參數。