我有一系列动物。我想搜索某个子类类型。动物数组只会包含每个子类类型中的一个。我尝试了以下,但不起作用。我得到一个编译错误,说明:“animalType不是一个类型”。
public static func getAnimal<T: Animal>(animalType: T.type) -> Animal {
for animal in self.animals {
if animal is animalType {
return animal
}
}
}
这可以在Swift中使用吗?
我想这样称呼它......
AnimalServices.getAnimal(Dog)
答案 0 :(得分:3)
这是一个简化的例子,请注意我返回一个可选的Animal,因为搜索可能会失败(编译器不知道你将总是只有一种这种类型的动物):
class Animal {
let name: String
init(name: String) {
self.name = name
}
}
class Cat: Animal {
init() {
super.init(name: "Cat")
}
}
class Dog: Animal {
init() {
super.init(name: "Dog")
}
}
struct Zoo {
static var animals: [Animal] = []
static func getAnimal<T: Animal>(animalType: T.Type) -> Animal? {
for animal in animals {
if animal is T {
return animal
}
}
return nil
}
}
Zoo.animals.append(Cat())
Zoo.getAnimal(Cat) // Returns the cat as optional
Zoo.getAnimal(Dog)
简而言之,T
是您的通用类型。 T.Type
表示您正在传递T类型作为参数。
答案 1 :(得分:1)
您可以使用标识运算符===
来检查数组元素的类型是否等于泛型类型:
if animal.dynamicType === animalType {
return animal
}
答案 2 :(得分:0)
您不能将is
或as
语法用于未知类型。只要kindOfClass
是Animal
的子类,就可以使用NSObject的NSObject
方法完成您要查找的类型反射:
class Animal: NSObject {
class func getAnimalOfType<T: Animal>(animals: [Animal], animalType: T.Type) -> Animal? {
for animal in animals {
if animal.isKindOfClass(animalType) {
return animal
}
}
return nil
}
}
class Zebra: Animal { }
class Whale: Animal { }
var animals = [Zebra(), Whale()]
Animal.getAnimalOfType(animals, animalType: Zebra.self)
如果Animal
不是NSObject
的子类型,您可以随时执行此操作 - 但对我来说这似乎有点不合时宜:
if "\(animal.dynamicType)" == "\(animalType)" {
return animal
}
答案 3 :(得分:0)
struct Test<T: Hashable> {
static func test(t: Any) {
println(t is T)
}
}
Test<Int>.test(3)
在这个例子中,我将类型(在我的情况下为Int,在您的中为animalType)传递给结构和变量(我的Int(3),您的动物)作为静态函数测试的参数。我使用T:Hashable,你会想用T:Animal测试。