【问题标题】:How do I create an extension to allow an array of a custom type to conform to a protocol?如何创建扩展以允许自定义类型的数组符合协议?
【发布时间】:2017-01-06 15:20:10
【问题描述】:

我有一个自定义类型Banana,我想创建BananaArray 扩展(或者,如果我必须,Sequence)以符合协议CustomStringConvertible,以便调用Banana 数组中的 description 将返回“A bundle of bananas”。这有可能吗?如果可以,我该怎么做?

【问题讨论】:

  • 看起来你必须等到 Swift 4。你描述的听起来像 this proposal
  • @CodeDifferent 这看起来不错,但我已经可以使用类似extension Sequence where Iterator.Element == Banana { ... } 的元素类型扩展Sequence。我只想让生成的序列符合CustomStringConvertible 或者这实际上是你提到的同一个提议?

标签: arrays swift swift-protocols


【解决方案1】:

简短回答:不。

您可以约束扩展,但受约束的扩展不能包含继承子句(上面链接的 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]"

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我已经得到了一个香蕉的信息(它确实符合 CustomStringConvertable,并且该属性刚刚称为描述),但我想打印香蕉的集合,而不仅仅是每个香蕉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多