はじめに
SwiftUIでアプリを開発していて、重複のないリストを作りたいと思いました。
まず、重複のないデータを扱うためにSetを使うことを考えました。しかし、Setは順番を保持しないため私の目的には合いませんでした。
そこで、Appleが公開しているライブラリ「OrderedCollections」を使うことにしました。このライブラリをインポートすると、重複がなく順番を保持できるOrderedSetという型を使用できます。これを使えば、私の目的を達成できそうです。
手順
1. ライブラリをインストールする
Apple Swift Packagesにあるswift-collectionsを選択
OrderedCollectionsにチェックを入れてAdd Package
2. コードを書く
コード全体
import SwiftUI
// OrderedCollectionsをインポート
import OrderedCollections
struct ContentView: View {
// OrderedSetを使う
@State private var people: OrderedSet<String> = [
"ジョブズ",
"ウォズ",
"クック",
"ジョニー",
"ジョン",
"エディ",
"フィル",
"クレイグ",
"アンジェラ"
]
var body: some View {
NavigationStack {
List {
// 重複がないのでidに.selfを指定してもバグが起きない
ForEach(people, id: \.self) { person in
HStack {
Text(person)
Spacer()
Button {
people.remove(person)
} label: {
Image(systemName: "minus.circle.fill")
.symbolRenderingMode(.palette)
.foregroundStyle(.white,.red)
}
.buttonStyle(.plain)
}
}
}
.animation(.easeInOut, value: people)
.toolbar {
Button {
// すでにpeopleに"ジョブズ"が入っていると追加できない
// "ジョブズ"を削除すると追加できる
people.append("ジョブズ")
} label: {
Image(systemName: "plus")
}
}
}
}
}
このコードを実行すると、最初はプラスボタンを押しても何も起きません。しかし、"ジョブズ"を削除してからプラスボタンを押すと"ジョブズ"が追加されます。OrderedSetがうまく機能していることがわかります。
おわりに
SwiftUIで重複のないリストを作る方法を紹介しました。この記事が参考になったという方は、いいねとフォローよろしくお願いします。
参考文献