Как я могу сохранить некоторую часть декодируемой структуры, которую json проанализировал в структуре UserDefaults в Swift 4? - PullRequest
0 голосов
/ 13 октября 2018

так вот моя структура, что я буду анализировать свой json в это

public struct Response : Decodable {
    var Data : [Data]?
    let Status : Int?
    let Message : String?
}
public struct Data : Decodable {
    let id : String?
    let full_name : String?
    let is_private : String?
    let profile_pic_url : String?
    let username : String?
    let biography : String?
    let type : String?
    let code : String?
    let date : String?
    let thumbnail_src : String?
    let display_src : String?
    let caption : String?
    let detail : String?
    let type_id : String?
    let district_id : String?
    let p_name : String?
}

, и здесь я сделал объект из моей структуры данных

public class publicVariables {
    static var savedItems = [listPageModel.Data]()
}

, и вот метод, когдамое приложение запускается впервые или нет

func setDefults() {
    let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
    if launchedBefore  {
        print("Not first launch.")


        let decoded  = UserDefaults.standard.object(forKey: "savedPosts") as! Data
        let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded)  as! [listPageModel.Data]
        publicVariables.savedItems = decodedTeams

    } else {

        print("First launch, setting UserDefault.")
        UserDefaults.standard.set(true, forKey: "launchedBefore")

        let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: publicVariables.savedItems)
        UserDefaults.standard.set(encodedData, forKey: "savedPosts")
        UserDefaults.standard.synchronize()


    }
}

, а затем я анализирую json в struct

var res : listPageModel.Response? = nil
var mainData = [listPageModel.Data]()
.
.
.
self.res = try JSONDecoder().decode(listPageModel.Response.self , from : data!)
 for i in 0...((self.res?.Data?.count)!) - 1 {
                            self.mainData.append((self.res?.Data?[i])!)
.
.
.

, так что теперь у нас есть декодированный json в структуру, и я могу показать, чтов табличном представлении или представлении коллекции теперь я хочу, чтобы пользователь выбирал из них индекс, сохраняющий в userDefaults, например, этот

self.res?.Data[0]

, поэтому я использовал этот метод здесь

@objc func likeDislike(_ sender : UIButton!) {
    print(sender.tag)
    if !publicVariables.savedItems.contains(where: {$0.code! == "\(self.res?.Data[sender.tag].code)"}) {

        print((self.mainData[sender.tag].caption)!)
        publicVariables.savedItems.append((self.mainData[sender.tag]))
        let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: [publicVariables.savedItems])
        publicVariables().defaults.set(encodedData, forKey: "savedPosts")
        publicVariables().defaults.synchronize()

    } else {

        print((self.mainData[sender.tag].caption)!)
        let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: [publicVariables.savedItems])
        publicVariables().defaults.set(encodedData, forKey: "savedPosts")
        publicVariables().defaults.synchronize()

    }
}

Но когдаэта функция будет запущена, я получу эту ошибку, и приложение вылетит

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x7f8eda563be0'
*** First throw call stack:
...