如何避免在函数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) { }
答案 0 :(得分:1)
我不确定你是否可以完全按照你的要求行事。类型是可以用来代替现有类型的符号,它不是限制模式。
您可以通过在类定义中添加一个额外的通用placehoder类型(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]>()