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

How do I create an extension to allow an array of a custom type to conform to a protocol?

我有一个自定义类型 Banana,我想创建 Array 的扩展(或者,如果必须,SequenceBanana 到符合协议 CustomStringConvertible,因此在 Banana 的数组上调用 description 将 return "A bunch of bananas"。这可能吗?如果可能,我该怎么做?

您可以在 banana class 中创建一个自定义方法,printDescription,它会打印您想要的描述。在这种情况下无需创建扩展。

简答:没有。

您可以限制扩展,但受限制的扩展不能包含继承子句(上面链接的 Swift proposal @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"

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

let bananas = [Banana(), Banana(), Banana()]
bananas.description // "[a banana, a banana, a banana]"