簡単に。
.onMove(perform:) modifierを使用する。
詳細に。
このmodifierはDynamicViewContent(データから動的に生成するViewのprotocol)に定義されており、より詳細に見ると次のとおり。
func onMove(perform action: Optional<(IndexSet, Int) -> Void>) -> ...
-
onMove(...)
は引数として、nil
あるいはクロージャ(IndexSet, Int) -> Void
を受け取る。-
nil
を渡すことで並替機能を無効化できる。 - クロージャの引数
-
IndexSet
は、動かしたい要素(単/複数)のインデックスの集合。 -
Int
は動かしたい要素が挿入されるべきインデックス。
-
-
上記クロージャに渡されることが多い下記メソッドについて。
MutableCollection.move(fromOffsets source: IndexSet, toOffset destination: Int)
source
に渡されていない(即ち動かす対象でない要素の)インデックスに関して、
destination
よりも小さいインデックスに紐づいていた要素はcollection
の前方に、
大きいインデックスに紐づいていた要素はcollection
の後方に移動される。
var letters = Array("ABcDefgHIJKlmNO")
let lowercaseOffsets = IndexSet(...) // 小文字たちのoffsets
letters.move(fromOffsets: lowercaseOffsets, toOffset: 2)
// String(letters) == "ABcefglmDHIJKNO"
// Reset the `letters` array.
letters = Array("ABcDefgHIJKlmNO")
letters.move(fromOffsets: lowercaseOffsets, toOffset: 15)
// String(letters) == "ABDHIJKNOcefglm"