Comment puis-je prolonger Swift Array<T>
ou T[]
type personnalisé fonctionnelle utils?
Navigation autour de Swift API docs montre que les méthodes de Tableau sont une extension de l' T[]
, e.g:
extension T[] : ArrayType {
//...
init()
var count: Int { get }
var capacity: Int { get }
var isEmpty: Bool { get }
func copy() -> T[]
}
Lors de la copie et le collage de la même source et d'essayer toutes les variantes comme:
extension T[] : ArrayType {
func foo(){}
}
extension T[] {
func foo(){}
}
Il ne parvient pas à construire avec l'erreur:
De type Nominal
T[]
ne peut pas être prolongé
En utilisant la totalité de la définition de type échoue avec l' Use of undefined type 'T'
,, je.e:
extension Array<T> {
func foo(){}
}
Et c'est aussi ne pas avec Array<T : Any>
et Array<String>
.
Curieusement Swift me permet de prolonger un non tableau avec:
extension Array {
func each(fn: (Any) -> ()) {
for i in self {
fn(i)
}
}
}
Qui cela me permet d'appeler avec:
[1,2,3].each(println)
Mais je ne peux pas créer un véritable générique type d'extension que le type semble être perdu quand il coule à travers la méthode, de l'e.g essayer de remplacer Swift filtre intégré avec:
extension Array {
func find<T>(fn: (T) -> Bool) -> T[] {
var to = T[]()
for x in self {
let t = x as T
if fn(t) {
to += t
}
}
return to
}
}
Mais le compilateur traite comme non typée où il permet l'appel de l'extension:
["A","B","C"].find { $0 > "A" }
Et quand on marchait à l'aide d'un débogueur indique le type est - Swift.String
mais c'est une erreur d'essayer d'accès comme une Chaîne sans moulage String
tout d'abord, je.e:
["A","B","C"].find { ($0 as String).compare("A") > 0 }
Personne ne sait quelle est la bonne manière de créer un typée méthode d'extension qui agit comme des extensions internes?