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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1908閲覧

swift5 クラスのインスタンスが入った配列で指定の要素を削除したい

yasumaro

総合スコア67

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/05/03 09:07

配列にクラスのインスタンスがある時、そのインスタンスのプロパティを検索し
ある条件があれば削除したいです。
実行できませんがこんな感じがしたいです

class Product : Identifiable{ var id:String! var name :String! var imageURL:String! var quantity :Int! }
//配列の中のインスタンスの要素idと新たに追加しようとしたインスタンスのidが同じなら消去して入れ直す. //(入れ直す時はquantityが違う値になっているので) array.filter({$0.id == product.id}).remove(at: )

用途例

struct Hoge { var selectedProducts = [Product]() var product:Product var body: some View { VStack{ ZStack{ Button(action: { //追加ボタンをタップした時 if self.product.quantity == 0 { self.product.quantity += 1                //ここで同じボタンを複数クリックする同じ物が入ってしまうのでproduct.idが同じ物がある時は //それを削除し新たに追加すると言う処理を入れたいです。 self.selectedProducts.append(self.product) //以下省略 }

調べたところ,swiftには要素を指定して削除できないらしいので下記の方法を取ったのですが
ソースの諸事情によりEquatableが入れられないので他に良い方法はないでしょうか。
https://qiita.com/fuziki/items/e8b1bb5b2dc8c8f43041

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

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

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

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

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

guest

回答1

0

ベストアンサー

要件がよく理解できていませんが、たとえばこのような感じでしょうか。

swift

1import UIKit 2 3class Product { 4 var id:String 5 var name :String 6 var quantity :Int 7 8 init(id: String, name: String, quantity: Int) { 9 self.id = id 10 self.name = name 11 self.quantity = quantity 12 } 13} 14 15var selectedProducts = [Product]() 16 17var product1 = Product(id: "1", name: "iPhone X", quantity: 1) 18var product2 = Product(id: "2", name: "iPhone Xs", quantity: 1) 19var product3 = Product(id: "3", name: "iPhone SE2", quantity: 1) 20 21selectedProducts.append(contentsOf: [product1, product2, product3]) 22 23// 同じ id の商品 24var newProduct = Product(id: "2", name: "iPhone Xs", quantity: 2) 25// 違う id の場合 26//var newProduct = Product(id: "4", name: "iPhone Xs MAX", quantity: 3) 27 28print("初期状態のカート") 29dump(selectedProducts) 30 31if let index = selectedProducts.firstIndex(where: { $0.id == newProduct.id }) { 32 // 同じ id があった場合は置き換え 33 selectedProducts.remove(at: index) 34 selectedProducts.insert(newProduct, at: index) 35} else { 36 // 同じ id がない場合は追加 37 selectedProducts.append(newProduct) 38} 39 40print("更新後のカート") 41dump(selectedProducts)

投稿2020/05/03 12:05

TsukubaDepot

総合スコア5086

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

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

yasumaro

2020/05/04 08:21

はい!まさにやりたいことです。 解決しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問