2017-01-26 7 views
0

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?

+2

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

+1

'func symmetricDifference (zu Array: [Element]) -> [Element] {' oder 'func symmetricDifference (zu Array: Array) -> Array {' –

+0

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) } }' –

Antwort

0

Es ist genau so, wie @Hamish oben in seinem Kommentar erwähnt, sind Sie Array mit einer Art erstreckt, und versuchen, die symmetricDifference mit einer anderen Art auszuführen (T: Hashable), dass der Compiler nicht ableiten kann.

Sie können das Problem beheben ein [Element] und es verwenden, den gleichen Typ wie Argument in der Funktion, so etwas wie diese Rückkehr:

extension Array where Element: Hashable { 

    func difference(array2: [Element]) -> [Element] { 
     let set1 = Set(self) 
     let set2 = Set(array2) 
     let intersection = set1.symmetricDifference(set2) 
     return Array(intersection) 
    } 
} 

ich diese Hilfe Sie hoffen.

+0

Sie können auch einfach verwenden 'Array' statt' [Element] ' –

+0

@LeoDabus Wahr !!! Swift folgert der Art zu –

+1

'Erweiterung Array wo Element: Hashable { func Mengenlehre # Differenz und Komplement (zum Array: Array) -> Array { return Array (Set (Selbst-) .symmetricDifference (Array)) } }' keine Notwendigkeit zu machen das zweite Array ein Set –

Verwandte Themen