2016-09-29 79 views
0

的價值我有一個功能,這需要其他幾個功能參數:傳遞函數作爲參數錯誤:無法將類型「someType.type」預期參數類型「SOMETYPE」

class Iterator { 
    func iterateItems(itemArray: [Items], removeItem: (Items) -> Void, addItem: (inout Items) -> Void, calculateEfficiency:() -> Void) -> [Items] { 
     // function body 
    } 
} 

我叫它在它的類的子類是這樣的:

class WPCalculator: Iterator { 

    func removeWeaponItem(item: WeaponItems) { ... } 
    func addWeaponItem(item: inout WeaponItems) { ... } 
    func calcWeaponDamage() { ... } 

    func iterateWPItems() { 
     iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem(item: WeaponItems), addItem: addWeaponItem(item: &WeaponItems), calculateEfficiency: calcWeaponDemage()) 
    } 
} 

然後Xcode中說,在removeItemaddItem參數錯誤:

Cannot convert value of type "WeaponItems.type" to expected argument type "WeaponItems"

另外,WeaponItems類是Items類的子類:

class WeaponItems: Items { ... } 

這是爲什麼錯誤信息?

+0

你能生成更多的代碼嗎?我將上面的源代碼剪切並粘貼到操場上。沒有足夠的上下文。也許你不應該在你調用removeItem和addItem的時候把變量'WeaponItems'命名爲類名WeaponItems'。 –

+0

代碼中出現了一些拼寫錯誤,對於混淆抱歉,我更新了它。我會看看我是否可以添加一些代碼。 –

回答

2

您正在傳遞類WeaponItems而不是類對象。以下是更正確的版本:

func iterateWPItems() { 
    let itemsToRemove = WeaponItems() //initialize object somehow 
    var itemsToAdd = WeaponItems() //initialize object somehow 
    iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem(item: itemsToRemove), addItem: addWeaponItem(item: &itemsToAdd), calculateEfficiency: calcWeaponDemage()) 
} 

編輯:對不起,我已經得到了你的問題。比,而不是調用這些方法你應該它們作爲參數傳遞,這樣你就不必把括號方法的名稱的線索:

func iterateWPItems() { 
    iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem, addItem: addWeaponItem, calculateEfficiency: calcWeaponDemage) 
} 
+0

我想傳遞函數('removeWeaponItem','addWeaponItem'和'calculateEfficiency')作爲參數,所以你的建議答案是好的,但它不是解決方案 –

+0

是的,你是對的,我只是意識到它,謝謝! –

0

在您調用iterateItems的過程中,removeWeaponItem(item: WeaponItems),WeaponItems是一種類型,因爲它與類名稱WeaponItems相同。如果您創建WeaponItems類型的變量,並將它們命名爲不同(例如weaponItems)而不是WeaponItems,那麼您可能不會遇到此問題。

+0

我是否創建了任何名爲'WeaponItems'的變量? –

+0

觀察調用iterateItems: FUNC iterateWPItems(){ iterateItems(itemArray:WeaponItems.weaponItems,的removeItem:removeWeaponItem(項目:WeaponItems)的addItem:addWeaponItem(項目:&WeaponItems),calculateEfficiency:calcWeaponDemage()) } –

+0

有一個'WeaponItems.weaponItems',它是類WeaponItems的變量,而不是類本身。順便說一句,我的代碼似乎有更多的錯別字,哎呀,我再次更新。 –

0

我發現這個問題:我通過了方式函數作爲參數是錯誤的,它應該是這樣的:

func iterateWPItems() { 
    iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem as! (Items) -> Void, addItem: addWeaponItem as! (inout Items) -> Void, calculateEfficiency: calcWeaponDemage()) 
} 
+0

是的,就是這樣,'calcWeaponDemage'最後不應該有括號。 – slashdot

相關問題