私のアプリは、カスタム クラスのインスタンスを格納するコア データを使用しますCustomClass
。
このクラスには多数のプロパティがあり、そのほとんどは標準型ですが、1 つのプロパティはxxx: Set<CustomObject>
です。
したがってxcdatamodeld
、 は (標準型を持つ他のものの中で) xxx
type の属性を指定しますTransformable
。xxx
ですSet<CustomObject>
。そのタイプはOptional
で、トランスフォーマーは現在NSSecureUnarchiveFromData
です。
以前は Transformer が指定されていなかったため、デコードは安全ではありませんでした。しかし、安全でないコーディングは将来廃止される予定であるため、Apple は現在、安全なコーディングを使用することを推奨しています。
安全なコーディングを有効にするために、次のことを行い
CustomClass
ましNSSecureCoding
たNSCoding
。
に以下var
が追加されましたCustomClass
。
public static var supportsSecureCoding: Bool { get { return true } }
次にpublic required convenience init?(coder aDecoder: NSCoder) {…}
、属性xxx
が安全にデコードされるように変更しようとしました。私は代わりにそれを知っています
let xxx = aDecoder.decodeObject(forKey: „xxx“) as? Set<CustomObject>
decodeObject(of:forKey:)
ここでof
は、デコードするオブジェクトのタイプです。ここでは typeを使用しますSet<CustomObject>
。
私の問題は、これを定式化する方法がわからないことです:
let xxx = aDecoder.decodeObject(of: Set<CustomObject>.self, forKey: „xxx“)
エラーが発生しますCannot convert value of type 'Set<CustomObject>.Type' to expected argument type '[AnyClass]?' (aka 'Optional<Array<AnyObject.Type>>‘)
。
どうやらコンパイラはコンパイルされませんでした
func decodeObject<DecodedObjectType>(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject, DecodedObjectType : NSCoding
代わりに
func decodeObject(of classes: [AnyClass]?, forKey key: String) -> Any?
つまりSet<CustomObject>
、単一のタイプとしてではなく、タイプのコレクションとして扱われます。
では、単一の型、つまり のみをデコードするように指定するにはどうすればよいSet<CustomObject>
でしょうか?