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

Ken*_*dge 5 generics generic-programming swift swift-protocols swift4

假设存在一个通用结构:

public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
// some methods...
}
Run Code Online (Sandbox Code Playgroud)

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

extension Matrix where T: SpecificClass : SomeProtocol {
    // This does not compile :(
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*tos 5

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

例如:

class SomeClass { }
protocol SomeProtocol { }

extension Matrix: SomeProtocol where T == SomeClass { }
Run Code Online (Sandbox Code Playgroud)

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

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


但一切都没有丢失......正如亚历山大正确指出的那样,已经有一个提议为Swift 4排队!该功能将被称为条件一致性(SE-0143).

面向所有面向协议的编程黑客的一个很好的例子:

extension Array: Equatable where Element: Equatable {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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


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