搜索数组为提供的类型的对象

时间:2015-03-02 18:30:36

标签: ios arrays swift generics

我有一系列动物。我想搜索某个子类类型。动物数组只会包含每个子类类型中的一个。我尝试了以下,但不起作用。我得到一个编译错误,说明:“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)

4 个答案:

答案 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)

您不能将isas语法用于未知类型。只要kindOfClassAnimal的子类,就可以使用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测试。