swift - Swift 4 解码/编码通用数据结构
问题描述
我有一个通用队列数据结构,它使用一个数组作为它的列表,我很难让队列符合可编码和可解码的要求。我有另一个使用队列的类,它也需要是可编码的,但除非它的成员变量是,否则它不能是娇惯的。
我尝试使队列符合可编码和可解码,对数据进行编码并将其保存为用户默认值,但这似乎不起作用,实际上我的 init(来自解码器)函数甚至因任何原因陷入无限循环。我真的可以使用一些帮助
//我的队列
public struct Queue<T: Codable> {
private var dataSource = [T]()
private var userDefaults = UserDefaults()
public init() {}
public func isEmpty() -> Bool{
return dataSource.isEmpty
}
public mutating func enqueue( element: T){
dataSource.append(element)
}
public mutating func dequeue() -> T?{
return isEmpty() ? nil : dataSource.removeFirst()
}
public func peek() -> T? {
return isEmpty() ? nil : dataSource.first
}
public func getCount() -> Int {
return dataSource.count
}
public func printQueue(){
print(dataSource)
}
}
public enum Error: String, Swift.Error{
case queueNotFound = "Queue Not Found!"
}
extension Queue: Encodable, Decodable {
public func encode(to encoder: Encoder) throws
{
let jsonEncoder = JSONEncoder()
let encodedData = try jsonEncoder.encode(dataSource)
userDefaults.set(encodedData, forKey: "queue")
print(encodedData)
//var container = encoder.container(keyedBy: CodingKey.self)
}
public init(from decoder: Decoder) throws
{
print("intilaizing")
let jsonDecoder = JSONDecoder()
guard let data = userDefaults.data(forKey: "queue"), let _ = try? jsonDecoder.decode(Queue.self, from: data)
else {
throw Error.queueNotFound
}
}
任何类都应该能够将此队列添加为数据成员,当我实现队列时,我相信编码函数可以工作,但解码器会导致一些无限循环
解决方案
您正在编码dataSource
- 这是[T]
- 但正在解码Queue
,这是行不通的。尝试
public init(from decoder: Decoder) throws
{
print("initializing")
guard let data = userDefaults.data(forKey: "queue") else { throw Error.queueNotFound }
dataSource = try JSONDecoder().decode([T].self, from: data)
}
顺便说一句,在您的代码中,解码后的值(以及电位DecodingError
)未被使用,这没有任何意义。
推荐阅读
- javascript - 服务器上的网站对待文件路径的方式与本地版本不同
- laravel - 在 laravel 中使用范围检查时间验证
- php - Codeigniter 2 多重连接和 where 语句
- java - Adding PubNub AnnotationProcessor in Android Studio
- python - 无法将数据从表单提交到 SQLAlchemy:sqlalchemy.orm.exc.UnmappedInstanceError?
- html - 文本框的宽度和高度被IE11减小
- java - 如何解决 Google 服务帐户团队驱动器创建文件权限不足的错误?
- javascript - Javascript ES2015 检查对象中的命名键之一是否为空
- r - 绘制 lm 预测值
- spring-security - Spring 安全性具有 SimpleGrantedAuthority 但 hasRole 不起作用