How would I rewrite this global function as a protocol extension?
import Darwin
func weightedRandomElement<S: SequenceType, T where S.Generator.Element == (T,Int)>(sequence: S) -> T! {
var selectedItem: T?
var selectedWeight = 0
for (item,weight) in sequence {
if Int(arc4random_uniform(UInt32(selectedWeight + weight))) < weight {
selectedItem = item
}
selectedWeight += weight
}
return selectedItem
}I've tried:
import Darwin
extension SequenceType where Generator.Element == (T,Int) {
func weightedRandomElement() -> T! {
var selectedItem: T?
var selectedWeight = 0
for (item,weight) in self {
if Int(arc4random_uniform(UInt32(selectedWeight + weight))) < weight {
selectedItem = item
}
selectedWeight += weight
}
return selectedItem
}
}Line 2: Use of undeclared type 'T'
And:
import Darwin
extension SequenceType {
func weightedRandomElement<T where Generator.Element == (T,Int)>() -> T! {
var selectedItem: T?
var selectedWeight = 0
for (item,weight) in self {
if Int(arc4random_uniform(UInt32(selectedWeight + weight))) < weight {
selectedItem = item
}
selectedWeight += weight
}
return selectedItem
}
}Line 6: 'Self.Generator.Element' is not convertible to '(Self, Self)'