在数组中搜索提供类型的对象

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)

您不能对未知类型使用 isas 语法。只要 AnimalNSObject:

的子类,就可以使用 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 来测试。