在数组中搜索提供类型的对象
Search array for object of provided type
我有一组动物。我想在其中搜索某个子 class 类型。 Animals 数组将只包含每个 sub-class 类型之一。我尝试了以下方法,但不起作用。我收到编译错误,指出:"animalType is not a type".
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)
您不能对未知类型使用 is
或 as
语法。只要 Animal
是 NSObject
:
的子类,就可以使用 NSObject 的 kindOfClass
方法来完成您正在寻找的那种类型反射
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
}
您可以使用恒等运算符===
来检查数组元素的类型是否等于泛型类型:
if animal.dynamicType === animalType {
return animal
}
这是一个简化的例子,注意我 return 一个可选的动物,因为搜索可能会失败(编译器不知道你总是只有一种这种类型的动物):
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 类型作为参数。
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 来测试。
我有一组动物。我想在其中搜索某个子 class 类型。 Animals 数组将只包含每个 sub-class 类型之一。我尝试了以下方法,但不起作用。我收到编译错误,指出:"animalType is not a type".
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)
您不能对未知类型使用 is
或 as
语法。只要 Animal
是 NSObject
:
kindOfClass
方法来完成您正在寻找的那种类型反射
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
}
您可以使用恒等运算符===
来检查数组元素的类型是否等于泛型类型:
if animal.dynamicType === animalType {
return animal
}
这是一个简化的例子,注意我 return 一个可选的动物,因为搜索可能会失败(编译器不知道你总是只有一种这种类型的动物):
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 类型作为参数。
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 来测试。