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

Posted

技术标签:

【中文标题】将函数作为参数传递错误:无法将类型“someType.type”的值转换为预期的参数类型“someType”【英文标题】:Passing functions as arguments error: Cannot convert value of type "someType.type" to expected argument type "someType" 【发布时间】:2016-09-29 06:58:50 【问题描述】:

我有一个函数,它接受其他几个函数作为参数:

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参数上说错误:

无法将“WeaponItems.type”类型的值转换为预期的参数类型“WeaponItems”

WeaponItems 类也是Items 类的子类:

class WeaponItems: Items  ... 

为什么会出现该错误消息?

【问题讨论】:

你能产生更多的代码吗?我将上面的源代码剪切并粘贴到操场上。没有足够的上下文。也许您不应该在调用 removeItem 和 addItem 时将变量命名为 WeaponItems 与类名 WeaponItems 相同。 代码中有一些错别字,很抱歉造成混乱,我更新了。我看看能不能加点代码。 【参考方案1】:

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

【讨论】:

我想将函数(removeWeaponItemaddWeaponItemcalculateEfficiency)作为参数传递,所以您提出的答案很好,但不是解决方案 是的,你是对的,我才意识到,还是谢谢!【参考方案2】:

在调用 iterateItems 时,removeWeaponItem(item: WeaponItems)WeaponItems 是一种类型,因为它与类名 WeaponItems 相同。如果您创建 WeaponItems 类型的变量,并以不同的方式命名它们(例如, WeaponItems)而不是 WeaponItems,您可能不会遇到这个问题。

【讨论】:

我是否创建了任何名为 WeaponItems 的变量? 观察对 iterateItems 的调用:func iterateWPItems() iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem(item: WeaponItems), addItem: addWeaponItem(item: &WeaponItems), calculateEfficiency: calcWeaponDemage() ) 有一个WeaponItems.weaponItems,它是WeaponItems 类的变量,而不是类本身。顺便说一句,我的代码中似乎还有一些错别字,哎呀,我又更新了。 我想你的意思是:iterateItems(itemArray: WeaponItems.weaponItems, removeItem: removeWeaponItem(item: WeaponItems.weaponItems), addItem: addWeaponItem(item: &WeaponItems.weaponItems), calculateEfficiency: calcWeaponDemage() ) 不,它应该是WeaponItems 的实例,例如let item = WeaponItems()【参考方案3】:

我发现了问题:我传递函数作为参数的方式不对,应该是这样的:

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

【讨论】:

是的,就是这样,calcWeaponDemage 后面不应该有括号。

以上是关于将函数作为参数传递错误:无法将类型“someType.type”的值转换为预期的参数类型“someType”的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组类型 char(字符串)作为函数参数传递?

如何将 Future 作为函数参数传递?

将字符串的 2darray 作为参数传递时出现“错误:类型的数组值”

将类型函数作为Dart中的参数传递

无法使用双指针作为函数参数传递二维数组[重复]

在 C 中将多维数组作为参数传递