ios - 无法将自定义类数组保存到 UserDefaults

标签 ios swift xcode nsuserdefaults swift4.2

我试图将自定义类数组保存到 UserDefaults,但它不起作用。我在 if let 上没有得到任何返回。我在网上到处找。我使用的是 Swift 4.2

extension UserDefaults {
    func saveReciters(_ reciters: [Reciter]) {
        do {
            let encodedData = try NSKeyedArchiver.archivedData(withRootObject: reciters, requiringSecureCoding: false)
            self.set(encodedData, forKey: UD_RECITERS)
        } catch {
            debugPrint(error)
            return
        }
    }

    func getReciters() -> [Reciter] {
        if let reciters = self.object(forKey: UD_RECITERS) as? Data {
            return NSKeyedUnarchiver.unarchiveObject(with: reciters) as! [Reciter]
        } else {
            print("EMPTY RECITERS")
            return [Reciter]()
        }
    }
}

UserInfo={NSDebugDescription=Caught exception during archival: -[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x600001babcc0

这就是我的课:

class Reciter: NSCoding {

private(set) public var name: String
private(set) public var image: UIImage?
private(set) public var surahs: [Surah]
private(set) public var documentID: String

private let quranData = QuranData()

init(name: String, image: UIImage?, surahCount: Int?, documentID: String) {
    self.name = name
    self.image = image
    self.documentID = documentID

    if let surahCount = surahCount {
        surahs = Array(quranData.getAllSurahs().prefix(surahCount))
    } else {
        surahs = quranData.getAllSurahs()
    }
}

func encode(with aCoder: NSCoder) {

}

required init?(coder aDecoder: NSCoder) {

}
}

在我的古兰经课上,我没有得到任何返回。我成功取回所有其他属性 enter image description here

最佳答案

我最常看到开发者使用codeable,这里我使用user作为例子:

YourDataModel.swift

struct User: Codable {
    var userId: String = ""
    var name: String = ""
    var profileImageData: Data? }

UserDefaults.swift

import Foundation

extension UserDefaults {

    /// The current user of the application, see `./Models/User.swift`
    var currentUser: User? {
        get {
            guard let userData = self.object(forKey: #function) as? Data else { return nil }
            return try? JSONDecoder().decode(User.self, from: userData)
        }

        set {
            guard let newuser = newValue else { return }
            if let userData = try? JSONEncoder().encode(newuser) {
                self.set(userData, forKey: #function)
            }
        }
    }

}

将数据转换为json数据...#function是函数或值名称,即

    // For the case the user doesn't yet exist.
    if ( UserDefaults.standard.currentUser == nil )  {
        // Create a new user
        user = User()
        // Generate an id for the user, using a uuid.
        user?.userId = UUID().uuidString
    } else {
        // otherwise, fetch the user from user defaults.
        user = UserDefaults.standard.currentUser
    }

关于ios - 无法将自定义类数组保存到 UserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54972461/

相关文章:

ios - 如何组合仅设置分段控件样式的重复代码?

ios - 约束无法与 View 和自定义 xib 文件正常工作

swift - 在 TableView - Swift 中创建的 7 个单元格之后添加部分

swift - 在 NSDictionary 上使用 map

xcode - UICollectionViewCell 将被显示/被显示?

ios - 如何根据尺寸类别在启动屏幕中显示不同的图像

ios - 为什么我在 xcode 中点击更新时出现错误 "No value was provided for the parameter ' certificateIds'。

ios - CoreData MapKit swift 3

ios - 自定义 Viewcontroller 转换未正确调整大小

swift - tableview controller 底部奇怪的灰色区域