将函数作为参数传递错误:无法将类型“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在removeItem
和addItem
参数上说错误:
无法将“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)
【讨论】:
我想将函数(removeWeaponItem
、addWeaponItem
和 calculateEfficiency
)作为参数传递,所以您提出的答案很好,但不是解决方案
是的,你是对的,我才意识到,还是谢谢!【参考方案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”的主要内容,如果未能解决你的问题,请参考以下文章