swift - 应用于多种类型的协议(protocol)扩展

标签 swift protocols swift4 swift-protocols

我有一个协议(protocol),例如:

protocol P {
    func foo()
}

可以对某些类型进行默认实现:

extension P where Self == Int {
    func foo() {
        // do something
    }
}

但是如何让几种类型具有相同的默认实现呢?像这样:

extension P where Self == Int or Self == Float {
    func foo() {
        // do something
    }
}

最佳答案

您可以将类型与另一个协议(protocol)(例如HasDefaultFoo)联合起来。这允许类型在需要默认实现时决定何时采用协议(protocol)。

protocol P {
    func foo()
}

protocol HasDefaultFoo {
    func foo()
}

extension Int: P, HasDefaultFoo { }
extension Float: P, HasDefaultFoo { }

extension P where Self: HasDefaultFoo {
    func foo() {
        print(self)
    }
}

extension Double: P {
    func foo() {
        print("I provide my own foo()")
    }
}

示例:

5.foo()
(5.5 as Float).foo()
5.5.foo()

输出:

5
5.5
I provide my own foo()

关于swift - 应用于多种类型的协议(protocol)扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51210967/

相关文章:

ios - iOS 应用程序中所有 UI 元素、 View 的全局样式、颜色、约束

ios - 无法在表格 View 自定义单元格中获取文本字段文本

swift4 - 同时访问0x10f10df48,但修改需要独占访问

ios - 如何在 Swift 4.0 中将 JSON 输出设置为 UILabel?

swift4 - 如何防止 Swift 4 重叠或独占访问错误?

ios - 调用existingObjectWithID时如何解析dynamicCastClassUnconditional断点

ios - Swift 从 Nib 创建自定义 View

Swift 泛型延期问题

ios - 委托(delegate)函数不调用

java - Java 的 UDP _DatagramSocket.connect()_ 有什么作用?