需要方法参数的类型和协议

csc*_*arz 26 xcode cocoa protocols ios swift

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

//Predefined classes
class Animal {
    var height: Float = 0.0
}
Run Code Online (Sandbox Code Playgroud)

我现在Zoo用接受动物的构造函数编写类.但是Zoo希望每只动物都有一个名字,因此定义了Namable协议.

protocol Namable {
    var name: String {get}
}

class Zoo {
    var animals: Animal[] = [];
}
Run Code Online (Sandbox Code Playgroud)

您如何编写一个addAnimal方法,要求将对象作为参数传递为类型 Animal符合协议 Namable?你如何为animals阵列声明?

    func addAnimal:(animal: ????) { ... }
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,我会写这样的东西

    - (void)addAnimal:(Animal<Namable>*)animal {...}
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 25

您可以将泛型与where具有多个条件的子句一起使用.

func addAnimal<T: Animal where T: Nameable>(animal: T) { ... }
Run Code Online (Sandbox Code Playgroud)

修正案:您应该使整个类成为通用类,以便您可以正确键入数组

class Zoo<T: Animal where T: Nameable> {
    var animals : T[] = []
    func addAnimal(a: T) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这很有效.但与Objective-C语法相比,它看起来很丑陋. (4认同)