2014-07-17 83 views
49

我想從DetailViewController類調用ViewController類中聲明的函數。Swift - 調用中的額外參數

當試圖調試在調用「額外的參數」錯誤彈出

在視圖控制器類:

func setCity(item : Cities, index : Int) 
{ 

    citiesArray!.removeObjectAtIndex(index) 
    citiesArray!.insertObject(item, atIndex: index) 
} 

在detailViewController類

// city of type Cities 
ViewController.setCity(city ,5) //Error: "Extra argument in call" 

這是非常簡單而我我很困惑。

+0

你問「呼叫中的額外爭論?」但該方法需要兩個論證...所以沒有額外的爭論。 – ColdLogic

+0

這是一個錯誤? 「通話中的額外參數」或問題 –

+0

通話中的額外參數是錯誤的抱歉! – Marin

回答

71

在某些情況下,即使調用看起來正確,但參數的類型與函數聲明的類型不匹配,也會給出「調用中的額外參數」。從你的問題來看,你看起來像是試圖將一個實例方法作爲一個類方法來調用,我發現它是其中的一種情況。例如,下面的代碼會給出確切的同樣的錯誤:

class Foo { 

    func name(a:Int, b: Int) -> String { 
     return "" 
    } 
} 

class Bar : Foo {  
    init() { 
     super.init() 
     Foo.name(1, b: 2) 
    } 
} 

您可以通過更改setCity的聲明是class func setCity(...)(在評論中提到的)在你的代碼解決這個問題;這將允許ViewController.setCity調用按預期工作,但我猜你想setCity是一個實例方法,因爲它似乎修改實例狀態。您可能想要爲您的ViewController類獲取實例並使用它來調用setCity方法。使用上面的代碼示例進行了說明,我們可以將Bar更改爲:

class Bar : Foo {  
    init() { 
     super.init() 
     let foo = Foo() 
     foo.name(1, b: 2) 
    } 
} 

Voila,沒有更多的錯誤。

+4

謝謝!該錯誤是完全誤導:( – Marin

+0

我有一個非常類似的問題,這其中兩個我的Objective-C方法有相同的前綴,說更新:...後不同的參數列表。它抱怨一個不可能的額外參數錯誤,並在閱讀這個答案後,我嘗試重命名它正在抱怨updateFoo的方法:並輕微的區別讓編譯器產生真正的錯誤:我已宣佈一個參數作爲它的真正類型的超類 – binarymochi

+0

讓我添加這也可能是一個問題,當有問題的方法需要一個C的互用性指針類型 –

2

你必須這樣稱呼它:

ViewController.setCity(city, index: 5) 

Swift has(as Objective-C)named parameters。

+3

對不起同樣的錯誤:在調用 – Marin

+3

額外的參數'索引'我得到同樣的錯誤。當他無法弄清楚如何調用一個函數時,只有那些使經驗豐富的程序員看起來很愚蠢的語言。 –

1

當編譯器強調的表達式沒有任何錯誤,並且指定的參數沒有錯誤,但是在與原始參數鏈接完全不同的線上有錯誤時,我有這個錯誤。例如:用對象(b)和(c)初始化對象(a),它們分別用(d)和(e)初始化。編譯器在(b)中說額外的參數,但實際上錯誤是(e)類型和(c)的預期參數之間的類型不匹配。

因此,基本上,檢查整個表達式。如有必要,分解它分配給臨時變量的部分。

然後等待Apple解決它。

1

如果類/結構方法和具有相同名稱但參數不同的全局方法之間存在衝突,則會出現此錯誤。例如,下面的代碼會產生這樣的錯誤:

enter image description here

您可能要檢查是否有適合您setCity方法這種衝突。

+0

要顯式調用全局函數,請使用模塊名稱。例如'Swift.min(x,y)'。 – Yonat

-1

在最新的Swift 2中。2,我有一個類似的錯誤時,拋出這花了一段時間來理清愚蠢的錯誤

class Cat { 
    var color: String 
    var age: Int 

    init (color: String, age: Int) { 
     self.color = color 
     self.age = age 
    } 

    convenience init (color: String) { 
     self.init(color: color, age: 1){ //Here is where the error was "Extra argument 'age' in call 
     } 
    } 
} 


var RedCat = Cat(color: "red") 
print("RedCat is \(RedCat.color) and \(RedCat.age) year(s) old!") 

的修復是相當簡單,只需去掉額外的「{}」之後「self.init(色:膚色,年齡:1)」的伎倆,即

convenience init (color: String) { 
     self.init(color: color, age: 1) 
    } 

最終使下面的輸出

"RedCat is red and 1 year(s) old!" 
9

在我的情況下調用非靜態功能從靜態功能導致此錯誤。將功能更改爲靜態固定錯誤。