【发布时间】:2016-10-13 08:51:07
【问题描述】:
原创
在我的项目中,我有一个Iterator 类,它有一个功能:
func iterateItems<T: Items>(iterationItems: [T], removeItem: (T) -> Void, addItem: (T) -> Void, calculateEfficiency: () -> Void) -> [T] {
...
return bestComposition as! [T]
}
在它的子类 WPCalculator 我这样运行它:
func iterateWPItems() -> [Items] {
return iterateItems(iterationItems: WeaponItems.weaponItems, removeItem: removeWeaponItem, addItem: addWeaponItem, calculateEfficiency: calcWeaponDemage)
}
新代码
那样一切都很好。现在我想把iterateItems 函数改成这样:
func iterateItems<T: Items>(iterationItems: [T], removeItem: (T) -> Void, addItem: (T) -> Void, calculateEfficiency: () -> Void) -> ([T], Int, String) {
...
return (bestComposition as! [T], bestBuildCost, customMessage)
}
然后我相应地更新了WPCalculator:
func iterateWPItems() -> ([Items], Int, String) {
return iterateItems(iterationItems: WeaponItems.weaponItems, removeItem: removeWeaponItem, addItem: addWeaponItem, calculateEfficiency: calcWeaponDemage)
}
现在我收到一个错误:无法表达元组转换 '([WeaponItems], Int, String)' 到 '([Items], Int, String)'
传递给iterateWPItems 的参数是一个WeaponItems 类型的数组,它是Items 的子类,它在原始版本中运行良好,Swift 似乎已经推断出子类到超类的转换,但是当我将它放在新代码中的元组中时,它不起作用。
这是为什么呢?我该如何解决这个问题?
编辑:
WeaponItems:
class WeaponItems: Items {
var weaponPower, attackSpeed, criticalChance, criticalDamage, armorPierce: Double
init(name: String, index: Int, price: Int, weaponPower: Double = 0, attackSpeed: Double = 0, criticalChance: Double = 0, criticalDamage: Double = 0, armorPierce: Double = 0, image: UIImage){
self.weaponPower = weaponPower
self.attackSpeed = attackSpeed
self.criticalChance = criticalChance
self.criticalDamage = criticalDamage
self.armorPierce = armorPierce
super.init(name: name, index: index, price: price, image: image)
}
...
}
Items:
class Items {
let name: String
let index: Int
let price: Int
let image: UIImage
init(name: String, index: Int, price: Int, image: UIImage) {
self.name = name
self.index = index
self.price = price
self.image = image
}
...
}
【问题讨论】:
-
你在哪个 Swift 版本中得到这个? Swift 3 中的一个简单测试对我来说效果很好。
-
@AntonBronnikov 这是 Swift 3
-
那你的
Items和WeaponItems是什么样子的? -
@AntonBronnikov 请查看编辑