如何使泛型 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...
假设存在一个通用结构:
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...