我正在尝试编写一些代码来检查列表是否包含给定类型T的元素,并且遇到了麻烦。本质上,此列表包含多个不同类型的元素 - 但是,每个类型都是从一个父类型子类化。我试过了
class Entity { }
class Goal : Entity { }
class Player : Entity { }
var entities = [Entity]()
entities.append(Player())
func listContainsClass<T: Entity>(var list: [Entity]) -> Bool {
for entity in entities {
if entity is T {
return true
}
}
return false
}
let contains = listContainsClass<Goal>(entities)
在这种情况下,我收到编译器错误,指出“无法明确地专门化通用函数”。如果我尝试在不指定泛型参数的情况下运行该函数(仅通过键入listContainsClass(entities)
),编译器将以seg-fault 11代码退出并且xCode崩溃,这是一个单独的问题。
我也尝试将类类型作为参数传递:
func listContainsClass(var list: [Entity], var type: Entity.Type) -> Bool {
for entity in entities {
if entity === type {
return true
}
}
return false
}
let contains = listContainsClass(entities, Player.self)
但我不确定如何使它工作,因为它总是返回错误。也许这只是一种古老的思维方式,因为我来自一个对象背景。
非常感谢任何有关正确方法的帮助!
答案 0 :(得分:2)
你太近了!使用您的第二个(非通用)实现,并且:
if entity.dynamicType === type {
答案 1 :(得分:2)
最简单的检查方法是使用内置的contains函数:
contains(entities, { $0 is Player } )
这与你正在构建的函数之间的一个区别是,这将接受更多的子类,其中你的函数(使用===)不会。