2017-05-10 31 views
2

如何避免功能限制的冗餘聲明f0f1,... f10在Swift中輸入帶模板的別名聲明

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

我不確定您是否可以完全按照您的要求進行操作。 typealias是一個可以用來代替現有類型的符號,它不是限制模式。

您可以通過添加額外的通用placehoder型(S)的類確定指標修復功能類型的類聲明:

class SomeClass0<T: UnsignedInteger, S: Sequence> where S.Iterator.Element == T { 

    func f0(sequence: S) { } 
    func f1(sequence: S) { } 
} 

但是,這意味着,引用類型是很醜陋的,除非可以推斷,從一個初始化等類型..

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]>() 
+0

謝謝你的回答! –