2014-06-08 30 views
0

我試圖內viewDidLoad中定義一個簡單的函數是這樣的:斯威夫特奇怪的行爲 - 函數調用外函數調用中

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    // my method below 
    func add(number1:Int, number2:Int) 
    { 
     println("sum \(number1 + number2)") 
    } 

    add(5, 7) // able to invoke simply by passing values 
} 

這裏我可以調用簡單地通過將兩個整數值添加功能,但是當我試圖定義的viewDidLoad外add方法是這樣的:

// my method defined outside viewDidLoad 
func add(number1:Int, number2:Int) 
{ 
    println("sum \(number1 + number2)") 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    add(5, number2: 7) // for second passed parameter I had to specify name of variable, since compiler was complaining 
} 

我無法簡單地通過將兩個值來調用它,我必須指定第二個變量的名字,因爲編譯器抱怨。

任何理由?

+1

我不知道爲什麼這個錯誤發生,我不知道,不指定任何標籤(如:'FUNC添加(_數字1:詮釋,_數字2:智力)')將允許無標籤。 – BergQuester

回答

1

正如David指出的,用作函數的方法(與對象相關聯的功能,這是)處理參數不同的,以「普通」的功能,以使ObjC樣式消息傳遞:

具體地說,夫特給出方法中的第一個參數名稱默認爲本地 參數名稱,默認情況下爲第二個和後續的 參數名稱指定本地和外部參數名稱。 該約定匹配您編寫Objective-C方法時熟悉的典型命名和調用約定,並使 表達式方法調用不需要限定名稱的參數 。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html#//apple_ref/doc/uid/TP40014097-CH15-XID_300

換句話說,斯威夫特把你的函數,如果你寫了像這樣,如果它被定義爲方法:

func add(number1:Int, #number2:Int) 
{ 
    println("sum \(number1 + number2)") 
} 

添加「#」在第二個參數你的第一個例子使得調用在兩種情況下都是一樣的(函數和方法調用)。 「#」號本身是本地參數名稱相匹配的參數名稱的縮寫,所以這會工作,太:

func add(number1:Int, number2 number2:Int) 
{ 
    println("sum \(number1 + number2)") 
} 

這使得固定接口,使其可調用更句子式的方式容易(同時切換到迅速引導風格的大括號放置):

func add(number1:Int, to number2:Int){ 
    println("sum \(number1 + number2)") 
} 

someInstance.add(2,to:3) 

更新斯威夫特3:

與SWIFT 3.0,這將改變,所有參數都在調用函數時所申報的使用。請參閱:

https://github.com/apple/swift-evolution/blob/master/proposals/0046-first-label.md

0

swift以不同方式處理方法和函數的參數。使用方法(爲了兼容Objective-C我懷疑)只有最初的標記:被省略,其餘的都是必需的。通過功能,所有標籤都被省略。