我试图将自定义类数组保存到 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]()
}
}
}
block 引用>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) { } }
最佳答案
我最常看到开发者使用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/