так вот моя структура, что я буду анализировать свой 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: