Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 要应用于多种类型的协议扩展_Swift_Protocols_Swift4_Swift Protocols - Fatal编程技术网

Swift 要应用于多种类型的协议扩展

Swift 要应用于多种类型的协议扩展,swift,protocols,swift4,swift-protocols,Swift,Protocols,Swift4,Swift Protocols,我有一个协议,例如: protocol P { func foo() } 可以为某些类型设置默认实现: extension P where Self == Int { func foo() { // do something } } 但是,如何对几种类型使用相同的默认实现呢?像这样: extension P where Self == Int or Self == Float { func foo() { // do somet

我有一个协议,例如:

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
    }
}

您可以将这些类型与另一个
协议
(例如
hasdaultfoo
)结合起来。这允许类型在采用协议时决定是否需要默认实现

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()