2015-03-02 24 views
2

我有一组动物。我想搜索它的某个子类的类型。动物数组将只包含每个子类类型中的一个。我已经尝试了以下,这是行不通的。我收到一个编译错误,指出:“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

你可以做一个如果让作为一种类型投,如果它失败,那么动物是不是这种类型 – Ian 2015-03-02 18:53:52

+0

我只是试过。 “if let a = animal as animalType {}”编译器仍然抱怨animalType不是一个类型。我是在修补语法吗? – lionpants 2015-03-02 18:56:26

回答

3

下面是一个简单的例子,注意我返回一个可选的动物,因为搜索可能会失败(编译器不知道你将永远有这种类型的只是一种动物):

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型参数。

+0

我很近。 ;)这正是我想要的。谢谢! – lionpants 2015-03-02 20:02:54

+0

或者作为一个不错的单行语句:'return animals.filter {$ 0 is T} .first'。虽然性能较差。 – Rengers 2015-03-02 20:26:20

0

你不能用一个未知类型使用isas语法。那种你正在寻找可以使用NSObject中的kindOfClass方法,只要Animal做的反射式的是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 
} 
1

可以使用的身份运营商===检查数组元素的类型等于泛型类型:

if animal.dynamicType === animalType { 
    return animal 
} 
+0

不,你不能。编译器会抛出一个错误:“二元运算符'==='不能应用于类型'Animal.Type'和'T'的操作数” – kellanburket 2015-03-02 19:47:11

+1

@blacksquare你必须做错某事 - 它在故事板中完美工作,并且此外,我没有在该代码片段中使用'T' ... – Antonio 2015-03-02 19:55:02

+0

我刚刚在swift 1.1中测试了您的代码,它的工作原理。我正在使用swift 1.2进行测试,并且抛出一个错误 - 所以要小心未来。我正在使用我用来比较返回的字符串值的语法,这是一个有效的比较,因为它们都是字符串。在任何事件中,问题的最佳答案是简单地检查'是T'。 – kellanburket 2015-03-02 20:03:25

0
struct Test<T: Hashable> { 

    static func test(t: Any) { 
     println(t is T) 
    } 
} 

Test<Int>.test(3) 

在这个例子中,我传递的类型(智力在我的情况,animalType在你)的结构和变量(我INT(3),你的动物)的静态功能测试的参数。我用T:Hashable,你会想用T:Animal来测试。