Swiftでは列挙型を定義できますが、コアデータはそれらを保存する方法を(すぐに)サポートしていません。
私がインターネットで見た(そしてこれまでに使用した)推奨される解決策は、プライベート変数を使用することです。
class ManagedObjectSubClass : NSManagedObject
{
enum Cards : Int
{
case Diamonds, Hearts
}
@nsmanaged var cardRaw: Int
var card : Cards {
set { self.cardRaw = newValue.rawValue }
get { return Cards(RawValue:cardRaw)! }
}
}
別の解決策は、以下の回答に示されています。
別のアプローチは、プリミティブ関数を使用することです。これにより、2つの変数を定義する必要がなくなります。モデルエディタでは、カードはIntとして定義されています。
class ManagedObjectSubClass : NSManagedObject
{
enum Cards : Int
{
case Diamonds, Hearts
}
var card : Cards {
set {
let primitiveValue = newValue.rawValue
self.willChangeValueForKey("card")
self.setPrimitiveValue(primitiveValue, forKey: "card")
self.didChangeValueForKey("card")
}
get {
self.willAccessValueForKey("card")
let result = self.primitiveValueForKey("card") as! Int
self.didAccessValueForKey("card")
return Cards(rawValue:result)!
}
}
}
編集:
繰り返し部分は、NSManagedObjectの拡張機能に移動できます。
func setRawValue<ValueType: RawRepresentable>(value: ValueType, forKey key: String)
{
self.willChangeValueForKey(key)
self.setPrimitiveValue(value.rawValue as? AnyObject, forKey: key)
self.didChangeValueForKey(key)
}
func rawValueForKey<ValueType: RawRepresentable>(key: String) -> ValueType?
{
self.willAccessValueForKey(key)
let result = self.primitiveValueForKey(key) as! ValueType.RawValue
self.didAccessValueForKey(key)
return ValueType(rawValue:result)
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加