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

How to make a generic class conform to a protocol for specific type?

假设存在一个通用结构:

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

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

extension Matrix where T: SpecificClass : SomeProtocol {
    // This does not compile :(
}

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

例如:

class SomeClass { }
protocol SomeProtocol { }

extension Matrix: SomeProtocol where T == SomeClass { }

给出非常明确的错误信息:

Extension of type Matrix with constraints cannot have an inheritance clause.


但并非一无所有...正如 Alexander 所指出的那样,已经有一份 Swift 4 的提案!该功能将被称为 Conditional Conformances (SE-0143).

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

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

如果一个数组包含可等化的元素,则该数组也是可等化的。


更新。 Swift 4 已发布,但此功能尚未落地。我们可能需要等到 Swift 5...