假设存在通用结构:
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
// some methods...
}
是否可以使用T
子句扩展struct以符合约束where
的协议?例如。
extension Matrix where T: SpecificClass : SomeProtocol {
// This does not compile :(
}
答案 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为此...