これは私の一般的なクラスです:汎用カスタムオブジェクトをUserDefaultsに保存するにはどうすればよいですか?
open class SMState<T: Hashable>: NSObject, NSCoding {
open var value: T
open var didEnter: ((_ state: SMState<T>) -> Void)?
open var didExit: ((_ state: SMState<T>) -> Void)?
public init(_ value: T) {
self.value = value
}
convenience required public init(coder decoder: NSCoder) {
let value = decoder.decodeObject(forKey: "value") as! T
self.init(value)
}
public func encode(with aCoder: NSCoder) {
aCoder.encode(value, forKey: "value")
}
}
その後、私はこれをしたい:
let stateEncodeData = NSKeyedArchiver.archivedData(withRootObject: currentState)
UserDefaults.standard.set(stateEncodeData, forKey: "state")
私の場合、私はNSKeyedArchiver.archivedData
を呼び出すときcurrentState
のタイプがSMState<SomeEnum>.
である。しかし、Xcodeの(9ベータ5)は、紫色のメッセージを示しています:
Attempting to archive generic Swift class 'StepUp.SMState<StepUp.RoutineViewController.RoutineState>' with mangled runtime name '_TtGC6StepUp7SMStateOCS_21RoutineViewController12RoutineState_'. Runtime names for generic classes are unstable and may change in the future, leading to non-decodable data.
私はそれが何を言おうとしているのか正確にはわかりません。一般的なオブジェクトを保存することはできませんか?
汎用カスタムオブジェクトを保存する他の方法はありますか?
edit
:
私はAnyHashable
の代わりに、ジェネリック医薬品を使用する場合でもNSKeyedArchiver.archivedData
を呼び出すときに、私は、実行時に同じエラーを取得:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: : unrecognized selector sent to instance
構造体をhttps://developer.apple.com/documentation/foundation/nscodingに準拠させます。 –
'T'を' NSCoding'に制限しようとしますか? – Sweeper
@Sweeper:Tは列挙型です。「非クラス型」のため、NSCodingに制約できません – Kobe