如何使泛型类符合特定类型的协议?

时间:2017-04-21 02:07:13

标签: swift generics swift4 generic-programming swift-protocols

假设存在通用结构:

public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
// some methods...
}

是否可以使用T子句扩展struct以符合约束where的协议?例如。

之类的东西
extension Matrix where T: SpecificClass : SomeProtocol {
    // This does not compile :(
}

1 个答案:

答案 0 :(得分:5)

不,这样的构造是不可能的(至少大约是Swift 3.1)。

例如:

class SomeClass { }
protocol SomeProtocol { }

extension Matrix: SomeProtocol where T == SomeClass { }

给出了一个非常明确的错误消息:

  

带约束的类型Matrix的扩展不能有继承子句。

但一切都没有丢失......正如亚历山大正确指出的那样,已经有一个针对Swift 4的提案了!该功能将被称为Conditional Conformances (SE-0143)

所有 protocol-oriented programming 黑客的一个很好的例子:

extension Array: Equatable where Element: Equatable {
   ...
}

如果数组包含等于的元素,则所述数组也是等同的。

<强>更新即可。 Swift 4已经淘汰,但此功能尚未登陆。我们可能需要等到Swift 5为此...