作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设存在一个通用结构:
public struct Matrix<T> where T: FloatingPoint, T: ExpressibleByFloatLiteral {
// some methods...
}
是否可以使用 where
子句扩展结构以符合约束 T
的协议(protocol)?例如。像
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...
关于swift - 如何使泛型类符合特定类型的协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43532767/
我是一名优秀的程序员,十分优秀!