0

我有一个通用队列数据结构,它使用一个数组作为它的列表,我很难让队列符合可编码和可解码的要求。我有另一个使用队列的类,它也需要是可编码的,但除非它的成员变量是,否则它不能是娇惯的。

我尝试使队列符合可编码和可解码,对数据进行编码并将其保存为用户默认值,但这似乎不起作用,实际上我的 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
        }

    }

任何类都应该能够将此队列添加为数据成员,当我实现队列时,我相信编码函数可以工作,但解码器会导致一些无限循环

4

2 回答 2

1

您正在编码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)未被使用,这没有任何意义。

于 2019-05-25T16:03:44.270 回答
0
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 (Array),它本质上与 dataSource 变量 ([T]) 的类型相同

于 2020-01-07T20:41:09.930 回答