如何避免函数 f0
, f1
, ... f10
中的冗余声明?
class SomeClass<T: UnsignedInteger> {
func f0<S: Sequence>(sequence: S) where S.Iterator.Element == T { }
func f1<S: Sequence>(sequence: S) where S.Iterator.Element == T { }
......
func f10<S: Sequence>(sequence: S) where S.Iterator.Element == T { }
}
如何声明这样的东西:
typealias S = Sequence where S.Iterator.Element == T
func f0(sequence: S) { }
func f1(sequence: S) { }
......
func f10(sequence: S) { }
?
最佳答案
我不确定你是否能完全按照你的要求去做。类型别名是可以用来代替现有类型的符号,它不是限制模式。
您可以通过向类定义添加额外的通用占位符类型 (S) 来将函数类型固定为类声明的类型:
class SomeClass0<T: UnsignedInteger, S: Sequence> where S.Iterator.Element == T {
func f0(sequence: S) { }
func f1(sequence: S) { }
}
但这意味着引用类型非常丑陋,除非您可以从 init 等推断类型。
let instance0 = SomeClass0<UInt, [UInt]>()
您仍然可以使用占位符类型在类级别修复序列类型,但省略 UnsignedInteger 占位符,具体取决于您如何使用它:
class SomeClass1<S: Sequence> where S.Iterator.Element: UnsignedInteger {
typealias T = S.Iterator.Element
func f0(sequence: S) { }
func f1(sequence: S) { }
func f99(number: T) {}
}
let instance1 = SomeClass1<[UInt]>()
关于swift - 在 Swift 中使用模板键入别名声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895949/