質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1722閲覧

2次元配列からIndexPathの範囲指定でその範囲に含まれるIndexPathを配列として取得する方法はありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/10/03 20:58

編集2018/10/04 10:10

いつもお世話になります。

tableView:moveRowAtIndexPath:toIndexPath:のなかで取得した、2つのIndexPathによる範囲指定で2次元配列からIndexPathを取得して配列をつくりたいのですが、簡潔な方法はないでしょうか?(説明が下手で申し訳ないです。)

for-inを使用して
enumurate()array.countから取得したIntからIndexPathを生成するしかないでしょうか?

取得した配列[IndexPaht]reloadRows(at:with:)で範囲指定したセルを更新するか、
セルを取得してから特定の値を書き換える目的で使いたいです。

イメージとしては

swift

1let arrayOfArray = [["A", "B", "C", "D"], ["D", "F"], ["G", "H", "I"], ["J", "K"]] 2 3// moveRowAtIndexpath => [0,3] 〜 toIndexPath => [2,1] 4 5// 下記のような配列を取得したい 6let IndexArray: [IndexPath] = [] 7// 中身が、[[0,3],[1,0],[1,1],[2,0],[2,1]] となるようにしたい。 8

一応以下のコードで実現できそうですが、もっとスマートな方法があれば教えてください。

swift

1 2let arrayOfArray = [["A", "B", "C", "D"], ["D", "F"], ["G", "H", "I"], ["J", "K"]] 3 4let startIndex: IndexPath = [0, 3] // moveRowAtIndexpathとtoIndexPathの小さい方を代入する 5let endIndex: IndexPath = [2, 1] // moveRowAtIndexpathとtoIndexPathの大きい方を代入する 6 7var indexArray: [IndexPath] = [] 8 9for (section, array) in arrayOfArray.enumerated() { 10 11 for (row, _) in array.enumerated() { 12 13 if (section < startIndex.section) || 14 (section <= startIndex.section && row < startIndex.row) || 15 (section == endIndex.section && row > endIndex.row) || 16 (section > endIndex.section) { 17 continue 18 } 19 20 let tempIndexPath: IndexPath = [section, row] 21 22 indexArray.append(tempIndexPath) 23 } 24} 25 26print("indexArray:",indexArray) 27 28// => indexArray: [[0, 3], [1, 0], [1, 1], [2, 0], [2, 1]] 29

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

どっち向きのスマートさを求めているのか分かりませんが、見た目スマート路線で。

swift

1for section in startIndex.section...endIndex.section { 2 let start = section == startIndex.section ? startIndex.row : 0 3 let end = section == endIndex.section ? endIndex.row : arrayOfArray[section].count-1 4 for row in start...end { 5 indexArray.append(IndexPath(row: row, section: section)) 6 } 7}

投稿2018/10/09 02:15

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/10 17:14

回答ありがとうございます。 だいぶ見通しが良く、わかりやすいです。 勉強になります。
guest

0

あまり元と比べてスマートになった感じがしませんが、一応書いたので。
flatMapを使うことでややこしそうなifを無くしてみました。

swift

1func generateRangeIndexPaths(gridArray: [[String]], startIndex: IndexPath, endIndex: IndexPath) -> [IndexPath] { 2 3 let flatIndexPaths: [IndexPath] = gridArray.enumerated() 4 .map { (section: $0.offset, array: $0.element) } 5 .map { secArgs in secArgs.array.enumerated() 6 .map { rowArgs in [secArgs.section, rowArgs.offset] } } 7 .flatMap { $0 } 8 9 let flatStartIndex: Int = gridArray.enumerated().filter { $0.offset < startIndex.section }.reduce(startIndex.row) { $0 + $1.element.count } 10 let flatEndIndex: Int = gridArray.enumerated().filter { $0.offset < endIndex.section }.reduce(endIndex.row) { $0 + $1.element.count } 11 12 return flatIndexPaths[flatStartIndex...flatEndIndex].map { $0 } 13} 14 15print("indexArray:", generateRangeIndexPaths(gridArray: arrayOfArray, startIndex: startIndex, endIndex: endIndex)) 16 17// => indexArray: [[0, 3], [1, 0], [1, 1], [2, 0], [2, 1]]

投稿2018/10/08 15:44

idonotknow

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/10 17:10

回答ありがとうございます。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問