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

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

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

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

Q&A

1回答

170閲覧

配列から選択したItemを全て取除く

nanana7

総合スコア1

Swift

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

0グッド

0クリップ

投稿2024/04/02 08:05

編集2024/04/04 03:27

ドラッグしたItemを選択にする機能なのですが、
すでにselectedItemsManager.selectedItemsにItemが入ってる場合、全て取り除きたいのですが、

swift

1 selectedItemsManager.selectedItems.removeAll{ $0 == item }

とすると
// Extra trailing closure passed in callのエラーになってしまいます。

selectedItemsManager.selectedItems.removeAll(where: { $0 == item })

としましたが、whereは不用と出ます。
しかし、公式のドキュメントをみると、where は必要とあります。

どうしたら、エラーは解消されますか?


追記

swift

1 2class SelectedItemsManager: ObservableObject { 3 @Published var selectedItems: Set<Item> = [] { 4 didSet { 5 isEditing = selectedItems.isEmpty ? false : true 6 } 7 } 8 9 @Published var isEditing: Bool = false 10 11 @Published var currentLocation: (x: Int, y: Int) = (-1, -1) 12 13}

です。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2024/04/02 12:18

selectedItemsが定義されている部分も質問欄にご記載いただけますでしょうか? > `selectedItemsManager.selectedItems.removeAll(where: { $0 == item })` > としましたが、whereは不用と出ます。 こちらもエラーの内容をコピペして質問欄にご記載いただけますでしょうか?
guest

回答1

0

質問欄の修正ありがとうございます。

ArrayにはremoveAll(where:)メソッドがあります。
removeAll(where:) | Apple Developer Documentation

ですが、SetにはremoveAll(where:)メソッドはありません。
SetにあるのはremoveAll(keepingCapacity:)メソッドのようです。
removeAll(keepingCapacity:) | Apple Developer Documentation

公式のドキュメントの「Removing Elements」のまとまりに(左側のナビゲーターの部分)
filter(_:) | Apple Developer Documentation
が記載されていることから、filterを使ってSetを生成しなおす感じになりそうですね。

swift

1selectedItemsManager.selectedItems = selectedItemsManager.selectedItems.filter({ $0 != item })

追記です。(4/15)

通知がきていませんでした。

回答者が回答に対するコメントをしても質問者に通知が届かないみたいですよね。

最初のひとつのみがSetに追加されるのみです。 .onChangedが可能していないのでしょうか?

Setは一意なデータを自動的に管理してくれるものです。
理解して使っているものだと思っていましたが、違いましたか・・?

You use a set instead of an array when you need to test efficiently for membership and you aren’t concerned with the order of the elements in the collection, or when you need to ensure that each element appears only once in a collection.
配列の代わりに集合を使用するのは、メンバーシップを効率的にテストする必要があり、コレクション内の要素の順序を気にしない場合、または各要素がコレクション内で一度だけ出現することを保証する必要がある場合です。

Set | Apple Developer Documentation

投稿2024/04/04 04:06

編集2024/04/15 09:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nanana7

2024/04/04 05:11

回答ありがとうございます。試してみましたが解決できませんでした。 (試した結果の詳細を記載してください) この場合どの辺りに原因がありそうでしょうか?
退会済みユーザー

退会済みユーザー

2024/04/04 11:10

コメントありがとうございます。 試した結果の詳細が記載されていませんので、ご記載ください。 具体的な結果の詳細やエラーメッセージなどの情報がないと、こちらとしては何もできないです・・
nanana7

2024/04/08 05:07

.gesture{ LongPressGesture(minimumDuration: 0.5) .onEnded { _ in selectedItemsManager.selectedItems.append(item) isTapping.toggle() } .sequenced(before: DragGesture(minimumDistance: 0)) .onChanged { value in let x = Int(value.location.x / (geometry.size.width / 5)) let y = Int(value.location.y / (geometry.size.height / 10)) if (0 ..< 5).contains(x), (0 ..< 10).contains(y) { if selectedItemsManager.selectedItems.contains(item) { selectedItemsManager.selectedItems.removeAll(where: { $0 == item }) } else { selectedItemsManager.selectedItems.append(item) } } } if isTapping { TapGesture() .onEnded { _ in if selectedItemsManager.selectedItems.contains(item) { selectedItemsManager.selectedItems.remove(where: { $0 == item }) } else { selectedItemsManager.selectedItems.append(item) } } .sequenced(before: DragGesture(minimumDistance: 0)) .onChanged { value in let x = Int(value.location.x / (geometry.size.width / 5)) let y = Int(value.location.y / (geometry.size.height / 10)) if (0 ..< 5).contains(x), (0 ..< 10).contains(y) { if selectedItemsManager.selectedItems.contains(item) { selectedItemsManager.selectedItems.removeAll(where: { $0 == item }) } else { selectedItemsManager.selectedItems.append(item) } } } } if selectedItemsManager.selectedItems.isEmpty { isTapping.toggle() } } コンパイラがパンクするようになってしまいました。 .filterに変えた場合も同じです
退会済みユーザー

退会済みユーザー

2024/04/08 12:30

> コンパイラがパンクするようになってしまいました。 状況がわからないですが、 修正前のコードに戻してみたらいかがでしょうか。 > .filterに変えた場合も同じです 仕様を正しく把握できていないのですが、 今回のケースの場合、 Setなのでitemが重複していることはないと思います。 `.removeAll()`を使わなくても`.remove()`で十分かなと思いました。 > お願い > teratailを「サポートセンター」だとは思わないでください。 > 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。 > あなたがそのようなつもりで質問しているのだと他のユーザーから誤解されないように、丁寧な質問を心がけましょう。 > [teratail【テラテイル】|ITエンジニア特化型Q&Aサイト](https://teratail.com/help/question-tips)
nanana7

2024/04/15 05:29

通知がきていませんでした。 LongPressGesture(minimumDuration: 0.5) .onEnded { _ in ep.selectedItems.insert(item) ep.isTapping.toggle() } .sequenced(before: DragGesture(minimumDistance: 0) .onChanged { value in let x = Int(value.location.x / (geometry.size.width / 5)) let y = Int(value.location.y / (geometry.size.height / 5)) if (0 ..< 5).contains(x), (0 ..< 5).contains(y) { if ep.selectedItems.contains(item) { ep.selectedItems.filter{ $0 == item } } else { ep.selectedItems.insert(item) } } } とすると、エラーはなくなりましたが、最初のひとつのみがSetに追加されるのみです。 .onChangedが可能していないのでしょうか?
nanana7

2024/04/15 10:46

つまりは どういうことでしょう?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問