测试列表是否包含Swift中特定类型的元素

时间:2015-06-06 22:17:25

标签: ios swift generics

我正在尝试编写一些代码来检查列表是否包含给定类型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)

但我不确定如何使它工作,因为它总是返回错误。也许这只是一种古老的思维方式,因为我来自一个对象背景。

非常感谢任何有关正确方法的帮助!

2 个答案:

答案 0 :(得分:2)

你太近了!使用您的第二个(非通用)实现,并且:

if entity.dynamicType === type {

答案 1 :(得分:2)

最简单的检查方法是使用内置的contains函数:

contains(entities, { $0 is Player } )

这与你正在构建的函数之间的一个区别是,这将接受更多的子类,其中你的函数(使用===)不会。