在Swift中使用模板键入Alias Declaration

时间:2017-05-10 14:49:40

标签: swift templates generics

如何避免在函数f0f1,... 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) { }

1 个答案:

答案 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]>()