如何创建扩展以允许自定义类型的数组符合协议?

Jos*_*oid 2 arrays swift swift-protocols

我有一个自定义类型Banana,我想创建一个Array(或者,如果必须的话,Sequence) of的扩展Banana以符合协议,CustomStringConvertible以便调用descriptionof 数组Banana将返回“一堆香蕉”。这是可能的,如果是这样,我将如何去做?

zpa*_*ack 5

简短的回答:没有。

您可以约束扩展,但受约束的扩展不能包含继承子句(上面链接的Swift 提案@Code Different 正是您要寻找的)。

一种解决方法是进行受约束的扩展,但只需添加您自己的属性,而不是使其符合CustomStringConvertible.

class Banana : CustomStringConvertible {
    var description: String {
        return "a banana"
    }
}

let aBanana = Banana()
aBanana.description // "a banana"

extension Array where Element: Banana {
    var bananaDescription: String {
        return "a bunch of bananas"
    }
}

let bananas = [Banana(), Banana(), Banana()]
bananas.bananaDescription // "a bunch of bananas"
Run Code Online (Sandbox Code Playgroud)

同样值得注意的是,这Array已经符合CustomStringConvertible.

let bananas = [Banana(), Banana(), Banana()]
bananas.description // "[a banana, a banana, a banana]"
Run Code Online (Sandbox Code Playgroud)