2017-02-14 8 views
0

のベース・アレイを取得し、私は値に基づいて、配列だけでなく、各要素のインデックスをソートする必要があるので、私はこのような何かをしたいと思います。その後、列挙配列

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

しかし、 bをインデックスなしの配列に戻す必要があります。私の現在のソリューションは、

let c = b.map { $0.1 } 

であるが、BはタイプEnumerateSequence<Array<Int>>であり、私が欲しいの配列を保持しているプロパティbaseを有しているので、簡単な方法があります場合、私は、思っていました。残念ながらbaseinternalで、私が望むものを返すメソッドがあるかどうかはわかりません。

注:(いずれかが存在する場合)私はスウィフト2のソリューションを必要としているときに、これがスウィフト2であることに気づいたかもしれませんスウィフト2とスウィフト3

違いがありますならば、私はもちろん興味があります
+1

'b'は' EnumerateSequence'型のものですか? 'sort'は配列を返します。ソート後、' EnumerateSequence'は取り返しがつかなくなります。 'base'プロパティが公開されていても、この場合はあなたを助けません。 –

+0

最も興味深い@OleBegemann。あなたは正しいです、私はどういうわけか間違ったインスタンスのタイプをチェックしていなければなりません。その有用なヒントありがとうございます。 – mmgross

答えて

0

しかし

let c = b.map { $0.1 }シンプルで簡単な方法があります場合、私は、思っていました。

+0

もちろん、あなたはなぜこれをやっているのか疑問に思うかもしれません。配列をソートするために列挙されたインデックスと値のペアが必要ではありませんか?だから、配列を単純明快に並べ替えるのはなぜですか?最初に 'enumerate'を呼び出すのは何ですか? – matt

+0

私が言ったように、値とインデックスに基づいてソートする必要があります。例として、 '$ 0%6 == $ 1%6'の要素の元の順序を保つ' .sort {$ 0%6 $ 1%6} 'と想像してください。 – mmgross

+0

わかりました。単純に言えば、私の言いたいことは、配列全体をもう一度横断することなく、私の言葉の意味がないことです。はい、これは実際のより良いパフォーマンスの必要性よりも好奇心から外れています。結局のところ、値はそこにあります。 – mmgross

0

これはわずかである(2文字)単純:

let c = b.map { $1 } 

map 2つの値のタプルを受け取り、あなたは$0.0$0.1、又は$0、及び$1ように、2つの値を参照するか、そう。クロージャーが$0のみを使用する場合は、$0がタプル全体です。したがって、.0および.1は個々の項目を参照します。クロージャーに$1が記述されている場合は、$0がタプルの最初の項目であり、$1がタプルの2番目の項目です。

+0

これはSwift 2と3で機能しますが、Swift 4では機能しなくなります。関連するSwift-Evolutionの提案は[SE-0110]です(https://github.com/apple/swift-evolution/blob /master/proposals/0110-distingish-single-tuple-arg.md)。 –

+0

ありがとう@OleBegemann。スウィフトは、それが改善することを恐れていないので、常に動いているターゲットです。 – vacawama