2017-02-14 3 views
0

Ich brauche ein Array zu sortieren, basierend auf dem Wert sowie der Index jedes Elements, so würde Ich mag so etwas tun:Holen Sie sich das Basisfeld eines numerisches Array

let a = [4,9,5,7].enumerate() 
let b = a.sort { ... } 

Aber dann Ich muss b zurück in ein Array ohne die Indizes konvertieren. Meine aktuelle Lösung ist

let c = b.map { $0.1 } 

Aber ich habe mich gefragt, ob es ein einfacherer Weg ist, da b vom Typ EnumerateSequence<Array<Int>> und hat eine Eigenschaft base, die das Array enthält, die ich will. Leider base ist internal und ich weiß nicht, ob es irgendeine Methode gibt, die zurückbringt, was ich will.

Hinweis: Sie haben vielleicht bemerkt, dass diese Swift ist 2. Während ich eine Lösung in Swift 2 müssen (falls vorhanden), ich bin natürlich interessiert, ob es einen Unterschied zwischen Swift 2 und Swift 3.

+1

Sind Sie sicher, dass 'b' vom Typ' EnumerateSequence' ist? 'sort' gibt ein Array zurück, also ist nach dem Sortieren die' EnumerateSequence' unwiederbringlich weg. Selbst wenn die "Basis" -Eigenschaft öffentlich wäre, würde Ihnen das in diesem Fall nicht helfen. –

+0

Am interessantesten @OleBegemann. Du hast recht, ich muss irgendwie den Typ der falschen Instanz überprüft haben. Danke für diesen hilfreichen Hinweis. – mmgross

Antwort

0

Aber ich habe mich gefragt, ob es einen einfacheren Weg,

Nr let c = b.map { $0.1 }ist einfach.

+0

Natürlich könnte man sich fragen, warum Sie das überhaupt tun. Sie brauchen sicherlich nicht die aufgezählten Index-Wert-Paare, um das Array zu sortieren, oder? Also, warum machst du nicht einfach nur ein Array, schlicht und einfach? Was ist der 'enumerate' Aufruf für an erster Stelle? – matt

+0

Wie gesagt: Ich muss nach Wert und Index sortieren, stelle mir '.sort {$ 0% 6 <$ 1% 6}' 'vor, wobei die ursprüngliche Reihenfolge der Elemente beibehalten wird, wobei $ 0% 6 == $ 1% 6' ein Beispiel ist. – mmgross

+0

Ok, einfach war eine schlechte Wortwahl meinerseits, was ich meinte ist: Ohne das ganze Array noch einmal durchlaufen zu müssen. Ja, das ist mehr aus Neugier als ein tatsächliches Bedürfnis nach besserer Leistung. Immerhin sind die Werte genau da. – mmgross

0

Diese (2 Zeichen) einfacher leicht ist:

let c = b.map { $1 } 

map erhält ein Tupel von zwei Werten, so können Sie entweder auf die beiden Werte als $0.0 und $0.1 oder als $0 finden und $1 . Wenn Ihre Schließung nur $0 verwendet, dann ist $0 das gesamte Tupel, also beziehen sich .0 und .1 auf die einzelnen Elemente. Wenn Ihre Schließung $1 erwähnt, dann ist $0 das erste Element des Tupels und $1 ist das zweite Element des Tupels.

+0

Dies funktioniert in Swift 2 und 3, aber beachten Sie, dass es in Swift 4 nicht mehr funktioniert. Der entsprechende Swift-Evolution-Vorschlag ist [SE-0110] (https://github.com/apple/swift-evolution/blob /master/proposals/0110-distingish-single-tuple-arg.md). –

+0

Danke @OleBegemann. Swift ist immer das bewegende Ziel, weil es keine Angst hat, sich zu verbessern. – vacawama

Verwandte Themen