Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@daisukenagata

Any型の配列のデータ削除方法

フリーランスの永田です。

今年は御茶ノ水で、iOSのアプリ開発をしています。

2月は忙しく、会社の隣にマンションを借りて、週7勤務をしました。
午後にお呼びがかかり、今週も週7でした。 自宅でも日夜技術レベルの向上に努めているのでアウトプットもしています。

最近のアウトプット、最新ソースでは動画トリミングの機能を追加しています。
https://github.com/daisukenagata/SliderView
挙動はこちら
https://twitter.com/dbank0208/status/1112172462777655296?s=20

Any型の配列のデータ削除方法が世の中に一つも情報としてなかったので共有します。
自分で考えました。

Structの配列

データを持ち回す時は構造体にする場合があると思います。
配列で要素名を指定出来たらいいなと思い、今回の実装を紹介します。

構造体のデータのあり、なしで、配列をクリアーする場合に

この方法ですと処理は要素1しか知らないので、要素の中身が違う場合に困りますね。

sampleAny?.remove(at: 1)

String型などでしたら、この方法で要素を指定して、消せます。

strArray.remove(at: strArray.index(of: "A")

Arrayの場合はSwift4まではEquatableで拡張クラスの対応でいけたと思います。

対応方法

Anyからcastメソッドで、指定の構造体にキャストします。

構造体のデータが空だったらクリアーするという処理。
構造体abc1を指定してabc1のデータチェックができます。
sampleAny?.removeFirst()の部分は
sampleAny.remove(at: i)などして、該当するabc1()をクリアーできますが、
配列に2つ以上ある場合はFilter関数,contains関数などの対応が必要です。

struct abc1 { 
 var abc = Int()
}

var sampleAny: [Any]? = []
sampleAny = [abc1(), abc3(), abc3(), abc1(), abc2(), abc3()]

let abc = abc1()

// ケースで応用
for (_, b) in sampleAny!.enumerated() {
   if abc.abc.description.isEmpty {
      if cast(value: b, type: abc1.self) != nil { sampleAny?.removeFirst() }
   }
}

func cast<A>(value: Any?, type: A.Type) -> A? { return value as? A }

以上、記録に残しました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?