基于通用类型T的扩展,其中T:Swift中的协议?

时间:2014-10-17 06:58:41

标签: generics swift protocols

是否可以根据Swift中的协议编写扩展名?

我知道我可以使用基类,但我不愿意。

protocol SomeProtocol {
    var numbers: [Int] { get set }
}


extentension T: SomeProtocol {
    func sumarize() -> Int {
        return self.numbers.reduce(0, +)
    }
}

2 个答案:

答案 0 :(得分:0)

我不认为这是支持的。正如您在官方Apple文档中看到的那样: -

https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/uid/TP40014097-CH24-XID_231

扩展程序为现有的类,结构或枚举类型添加新功能。

不幸的是协议似乎没有在这里讨论

答案 1 :(得分:0)

你可以。实际上,许多内置类型都是用它实现的。像:

extension Array : Printable, DebugPrintable {
    var description: String { get }
    var debugDescription: String { get }
}

我的意思是,您可以在扩展程序中实施协议。请参阅this document

在您的情况下,在var numbers:[Int]中实施extentension T: SomeProtocol { ... }是您的责任。像:

protocol SomeProtocol {
    var numbers: [Int] { get set }
}

struct T {
    private var _numbers:[Int] = [1,2,3]
}

extension T:SomeProtocol {
    var numbers:[Int] {
        get {
            return self._numbers
        }
        set(newVal) {
            self._numbers = newVal
        }
    }

    func sumarize() -> Int {
        return self.numbers.reduce(0, +)
    }
}