我正在玩Swift,并且遇到了以下问题:给定我有预定义的类Animal:

//Predefined classes
class Animal {
    var height: Float = 0.0
}

现在,我使用接受动物的构造函数编写Zoo类。但是Zoo希望每个动物都有一个名字,因此定义了Namable协议(protocol)。
protocol Namable {
    var name: String {get}
}

class Zoo {
    var animals: Animal[] = [];
}

您将如何编写addAnimal方法,该方法要求作为参数传递的对象必须是类型 Animal都符合协议(protocol) Namable?以及如何为animals数组声明它?
    func addAnimal:(animal: ????) { ... }

在Objective-C中,我会写这样的东西
    - (void)addAnimal:(Animal<Namable>*)animal {...}

最佳答案

您可以在具有多个条件的where子句中使用泛型。

func addAnimal<T: Animal where T: Nameable>(animal: T) { ... }

修订:您可能应该使整个类具有通用性,以便您可以正确键入数组
class Zoo<T: Animal where T: Nameable> {
    var animals : T[] = []
    func addAnimal(a: T) {
        ...
    }
}

10-06 15:32