Swift 4 decoding/encoding 一个通用的数据结构
Swift 4 decoding/encoding a generic data structure
我有一个使用数组作为其列表的通用队列数据结构,我很难使队列符合可编码和可解码。我有另一个 class 使用队列,它也需要 Codable 但它不能被溺爱,除非它的成员变量是。
我已经尝试使队列符合可编码和可解码,编码数据并将其保存为用户默认值,但这似乎不起作用,事实上我的 init(from decoder) 函数甚至陷入了无限循环无论出于何种原因。我真的需要一些帮助
//我的队列
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
}
}
任何 class 都应该能够将此队列添加为数据成员,当我实现队列时,我相信编码功能有效,但解码器会导致一些无限循环
您正在编码 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
未被使用,这毫无意义。
extension Queue {
enum CodingKeys: String, CodingKey {
case dataSource
}
extension Queue: Encodable, Decodable {
public func encode(to encoder: Encoder) throws
{
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(dataSource, forKey: .dataSource)
}
public init(from decoder: Decoder) throws
{
print("initializing Queue:")
let data = try decoder.container(keyedBy: CodingKeys.self)
dataSource = try data.decode(Array.self, forKey: .dataSource)
}
我改为使用 CodingKeys,并将类型更改为 Array.self(数组),它与数据源变量 ([T])
本质上是同一类型
我有一个使用数组作为其列表的通用队列数据结构,我很难使队列符合可编码和可解码。我有另一个 class 使用队列,它也需要 Codable 但它不能被溺爱,除非它的成员变量是。
我已经尝试使队列符合可编码和可解码,编码数据并将其保存为用户默认值,但这似乎不起作用,事实上我的 init(from decoder) 函数甚至陷入了无限循环无论出于何种原因。我真的需要一些帮助
//我的队列
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
}
}
任何 class 都应该能够将此队列添加为数据成员,当我实现队列时,我相信编码功能有效,但解码器会导致一些无限循环
您正在编码 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
未被使用,这毫无意义。
extension Queue {
enum CodingKeys: String, CodingKey {
case dataSource
}
extension Queue: Encodable, Decodable {
public func encode(to encoder: Encoder) throws
{
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(dataSource, forKey: .dataSource)
}
public init(from decoder: Decoder) throws
{
print("initializing Queue:")
let data = try decoder.container(keyedBy: CodingKeys.self)
dataSource = try data.decode(Array.self, forKey: .dataSource)
}
我改为使用 CodingKeys,并将类型更改为 Array.self(数组),它与数据源变量 ([T])
本质上是同一类型