传递函数作为参数错误:无法将类型“someType.type”预期参数类型“SOMETYPE”

问题描述:

的价值我有一个功能,这需要其他几个功能参数:传递函数作为参数错误:无法将类型“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

代码中出现了一些拼写错误,对于混淆抱歉,我更新了它。我会看看我是否可以添加一些代码。 –

您正在传递类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

是的,你是对的,我只是意识到它,谢谢! –

在您调用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的变量,而不是类本身。顺便说一句,我的代码似乎有更多的错别字,哎呀,我再次更新。 –

我发现这个问题:我通过了方式函数作为参数是错误的,它应该是这样的:

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

是的,就是这样,'calcWeaponDemage'最后不应该有括号。 – slashdot