

`TextField`に入力した文字を`シリアライズ`して`UserDefaults`で文字を保存して、`viewDidload`でアプリ起動時に、保存した文字を`デシリアライズ`して文字を復元して表示させたいのですが、表示されません。

どうすればよいでしょうか？ビルド自体はうまくいきます。

ちなみに`NSCoding`ではなく`NSSecureCoding`を使えばほぼ同じコードでうまくいきます。

[code]

    // ViewController.swift
    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var textField: UITextField!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            let data = loadData()
            self.textField.text = data?.valueString
        }
        
        @IBAction func tapButton() {
            let data = MyClass()
            data.valueString = self.textField.text
            self.saveData(data)
        }
        
        
        func saveData(_ data: MyClass) {
            let userDefaults = UserDefaults.standard
            //シリアライズ(オブジェクトの内容をバイナリに変換)
            //カスタムクラス(MyClass)はそのままUserDefaultsで保存できないためシリアライズしてData型に変換する
            if let archiveData = try? NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: false) {
                userDefaults.setValue(archiveData, forKey: "valueSS")
                userDefaults.synchronize()
                print("シリアライズ成功")
            } else {
                print("シリアライズ失敗")
            }
        }
        
        func loadData() -> MyClass! {
            let userDefaults = UserDefaults.standard
            if let storedData: Data = userDefaults.object(forKey: "valueSS") as? Data {
                do {
                    //デシリアライズ(バイナリをオブジェクトに変換)
                    return try NSKeyedUnarchiver.unarchivedObject(ofClass: MyClass.self, from: storedData)
                    
                } catch {
                    print("デシリアライズ失敗")
                }
            }
            return nil
        }
    }
    
    
[/code]

[code]

    // MyClass.swift
    
    import Foundation
    
    class MyClass: NSObject, NSCoding {
    
        var valueString: String?
    
        override init() {
        }
    
        // load
        required init?(coder decoder: NSCoder) {
            if let valueString = decoder.decodeObject(forKey: "valueSS") as? String {
                self.valueString = valueString
            }
        }
    
        // save
        func encode(with coder: NSCoder) {
            coder.encode(self.valueString, forKey: "valueSS")
        }
    }
    
[/code]


CC BY-SA 4.0
2021-03-18T14:35:22.393
74745
2021-03-18T15:34:18.560
2021-03-18T15:34:18.560
40856
40856
question
swift
Swiftで独自クラスを保存する際にシリアライズ/デシリアライズでデータを保存/復元したいのですが、うまくいかない