【问题标题】:Extensions based on Generic Type T where T : Protocol in Swift?基于通用类型 T 的扩展,其中 T:Swift 中的协议?
【发布时间】:2014-10-17 15:24:21
【问题描述】:

是否可以在 Swift 中编写基于协议的扩展?

我知道我可以使用基类,但我不想这样做。

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


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

【问题讨论】:

标签: generics swift protocols


【解决方案1】:

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

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

扩展向现有的类、结构或枚举类型添加新功能。

不幸的是,这里似乎没有涵盖协议

【讨论】:

    【解决方案2】:

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

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

    我的意思是,你可以在扩展中实现协议。this document

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

    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, +)
        }
    }
    

    【讨论】:

    • 我的意思是 T 是一个泛型类。所以扩展只适用于所有实现协议“SomeProtocol”的类
    • 查看我对您原始帖子的评论。
    猜你喜欢
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多