2017-10-18 7 views
1

J'ai du code que j'essaie de rendre générique, et je n'arrive pas à comprendre comment.Génériques dans les extensions de séquence

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

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

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

Essentiellement, je veux prendre un tableau de fermeture, qui renvoient une valeur de type T, et retourner un tableau de type [T] avec tous les résultats.

C'est ma tentative:

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

fonctionne Cependant, cela ne clairement pas, comme T est indéfini. Comment pourrais-je écrire cette extension?

Répondre

1

Vous pouvez faire le travail de la fonction callAll générique uniquement sur Sequence s, où Element est de type ()->T, mais pour autant que je sache, vous ne pouvez pas déclarer un type générique dans une clause where à une extension.

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]