2017-10-18 16 views
1

私はジェネリックにしようとしているいくつかのコードを持っています。シーケンス拡張のジェネリック

func randomInt() -> Int { return Int(arc4random_uniform(42)) } 

let closures = [randomInt, randomInt, randomInt, randomInt] 

let result = closures.map { $0() } 
print(result) 

は本質的に、私はタイプTのいくつかの値を返すクロージャの配列を、取り、すべての結果をタイプ[T]の配列を返すようにしたいです。

これは私の試みです:Tが定義されていないよう

extension Sequence where Element ==() -> T 
{ 
    func callAll() -> [T] 
    { 
     return self.map { $0() } 
    } 
} 

しかし、これは明らかに、動作しません。この拡張機能を書くにはどうすればいいですか?

答えて

1

あなたはElementはタイプ()->Tのですが、私の知る限り、あなたが内線にWHERE句でジェネリック型を宣言することはできませんだけSequenceの上の汎用callAll機能の作業を行うことができます。

extension Sequence { 
    func callAll<T>() -> [T] where Self.Element ==()->T{ 
     return self.map { $0() } 
    } 
} 

func randomInt() -> Int { return Int(arc4random_uniform(42)) } 

let closures = [randomInt, randomInt, randomInt, randomInt] 

let result = closures.callAll() 
print(result) //one sample output: [41, 19, 15, 36] 
関連する問題