Ich schrieb diese Funktion, um den Unterschied zwischen zwei Arrays von Strings zu erhalten.Generische Array-Erweiterung für symmetricDifference
func difference<T:Hashable>(array1: [T] ,array2:[T]) ->[T]? {
let set1 = Set<T>(array1)
let set2 = Set<T>(array2)
let intersection = set1.symmetricDifference(set2)
return Array(intersection)
}
Jetzt möchte ich es auf eine generische Funktion für verschiedene Arten erweitern wie Int
, Double
etc ...
extension Array where Element: Hashable {
func difference<T:Hashable>(array2: [T]) -> [T] {
let set1 = Set(self)
let set2 = Set(array2)
let intersection = set1.symmetricDifference(set2)
return Array(intersection)
}
}
Mit dieser Erweiterung ich den Fehler:
Generic parameter 'S' could not be inferred.
Ich versuchte verschiedene Ansätze, aber vergeblich. Was könnte das Problem sein?
Sie definieren einen neuen generischen Platzhalter 'T' für Ihre Methode, der nicht notwendigerweise der gleiche Typ wie' Element' ist. Verwenden Sie einfach einen Parameter und einen Rückgabetyp von '[Element]' - siehe zum Beispiel [diese Q & A] (http://stackoverflow.com/q/41045212/2976878). – Hamish
'func symmetricDifference (zu Array: [Element]) -> [Element] {' oder 'func symmetricDifference (zu Array: Array) -> Array {' –
Ich denke, dass es besser wäre, ein Set anstelle eines Arrays zurückzugeben: Element 'Erweiterung Array wo: Hashable { func Mengenlehre # Differenz und Komplement (zum Array: Array) -> Set { return Set (Selbst-) .symmetricDifference (Array) } }' –