LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-31

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

今年は御茶ノ水で、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 }

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0