Como criar genéricos na restrição de tipo de coleção?

Eu tenho tentado extrair valores não nulos da matriz String. Como abaixo. Mas, meu veterano quer que ele seja capaz de extrairvalores não nulos de outros tipos também.

Eu li,genéricos poderia me ajudar a lidar com diferentes tipos. Como posso usar genéricos para que eu possa usar as seguintes extensões para trabalhar com outros tipos também?

getNonNil deve retornar os valores não nulos extraídos do tipo específico (ou seja,se o array for [String?], ele deve retornar [String], retorna [Int] se [Int?])

Porque eu tenho que fazer mais cálculos.

O que eu tentei está abaixo:

import Foundation
// Extended the collection-type so that collectiontype is constrained to having element with optional strings
extension CollectionType where Self.Generator.Element == Optional<String>{
    func getNonNil() -> [String] {
        // filter out all nil elements and forcefully unwrap them using map
        return self.filter({$0 != nil}).map({$0!})
    }
}

// Usage
let x: [String?] = ["Er", "Err", nil, "errr"]

x.getNonNil().forEach { (str) in
    print(str)
}

questionAnswers(3)

yourAnswerToTheQuestion