概要

SwiftUIを使ったiOSアプリの開発で、CoreDataに保存する値をいくつかの値しか保存しないようにしたいということがありました。

そのようなときに、Enumを使って特定の値しか保存しないようにする方法を紹介します。

環境

  • SwiftUI 3
  • Xcode 13

方針

CoreDataには、直接Enumのデータを保存する方法はないようです。そのため、今回はIntegerやInt16のような整数値の型のカラムに、Enumで指定した整数値を保存するという方法で実装をします。

さらにEnumを利用して整数値と文字列を対応させます。SwiftのEnumでは、内部にメソッドを持つことが出来るので、それを使って整数値を引数にメソッドを呼び出した際に文字列を返すということをやります。

実際にやってみると分かるのですが、意識してEnumを使うようにしないといけないため、あまりいい実装とはいえなさそうです。しかし、他にやり方が分からないので、このようにしました。

実装

Enumを次のように実装しました。

enum Classification: Int16 {
    case none = 1
    case facebook = 100
    case instagram = 200
    case twitter = 300

    static func translate(val: Int16) -> String {
        switch (val) {
        case 1:
            return "指定なし"
        case 100:
            return "Facebook"
        case 200:
            return "Instagram"
        case 300:
            return "Twitter"
        default:
            return ""
        }
    }
}

今回、Enumの名前を分類を表すClassificationとしました。このClassificationを使うようにして、CoreDataに値を保存したり、取り出した値を文字列に変換させたりします。

// 表示
let classification: String = Classification.translate(val: item.classification)
Text(classification)

// 保存
let newItem = Item(context: viewContext)
newItem.classification = Classification.none

SwiftUIを利用しているコードの中から、表示や保存のコード部分だけを抜き取りました。

表示の部分については、Classificationの中の静的メソッドを用いて値を文字列に変換して表示しています。

保存の部分については、Classificationを用いて整数値を代入しています。実際のviewContext.save()などは自分自身で追加してください。

あまりよいやり方ではなさそうですが、これで特定の値のみ保存するようにできました。

さいごに

今回調べていく過程で、Enumの中にメソッドを書けるというのを知りました。これは結構応用が利きそうなので、他の部分でも使っていければと思っています。