2017-05-10 11 views
2

機能の冗長宣言の回避方法f0,、... f10Swiftのテンプレートを使用したエイリアス宣言

typealias S = Sequence where S.Iterator.Element == T 

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

:このような何かを宣言する方法

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 { } 
} 

答えて

0

あなたが求めていることを正確に行うことができるかどうかはわかりません。タイプアリアスは、既存のタイプの代わりに使用できるシンボルであり、制限パターンではありません。

あなたはクラスdefintionに追加ジェネリック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

ありがとうございました! –

関連する問題