gpt4 book ai didi

arrays - 在设备上本地保存自定义类数组

转载 作者:行者123 更新时间:2023-11-28 12:12:10 30 4
gpt4 key购买 nike

我有一个用作数组模型的自定义类。它们数组的元素是使用 Alamofire 从 API 中获取的。应用程序的用户可以从 tableview 中保存数组的一些元素,即使在没有互联网的情况下也可以显示。我正在尝试使用用户默认值,但出现错误。

数组的自定义类

class LatestNews {

private var _id : Int!
private var _link : Int!
private var _category : String!
private var _tag : String!
private var _headline : String!
private var _story : String!

var latestNews : LatestNews!
var latest = [LatestNews]()

var id : Int {
if _id == nil {
_id = 0
}
return _id
}

var link : Int {
if _link == nil {
_link = 0
}
return _link
}

var category : String {
if _category == nil {
_category = ""
}
return _category
}

var tag : String {
if _tag == nil {
_tag = ""
}
return _tag
}

var headline : String {
if _headline == nil {
_headline = ""
}
return _headline
}

var story : String {
if _story == nil {
_story = ""
}
return _story

init(getLatest : [String: Any]) {

if let id = getLatest["id"] as? Int {
self._id = id
}

if let link = getLatest["link"] as? Int {
self._link = link
}

if let category = getLatest["category"] as? String {
self._category = category
}

if let tag = getLatest["tag"] as? String {
self._tag = tag
}

if let headline = getLatest["headline"] as? String {
self._headline = headline
}

if let story = getLatest["story"] as? String {
self._story = story
}
}

}

用户默认函数

func transferOfflineData(news: [LatestNews]) {
self.offlineData = news

if UserDefaults.standard.object(forKey: "OfflineData") == nil {
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: self.offlineData)
UserDefaults.standard.set(encodedData, forKey: "OfflineData")
UserDefaults.standard.synchronize()
} else {
self.prevOfflineData = UserDefaults.standard.object(forKey: "OfflineData") as! [LatestNews]
self.prevOfflineData.append(offlineData.first!)
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: self.prevOfflineData)
UserDefaults.standard.set(encodedData, forKey: "OfflineData")
UserDefaults.standard.synchronize()
}
}

我得到的错误

2018-01-04 00:26:54.967563+0530 Khabar7[74210:3333998] *** NSForwarding: warning: object 0x7f7f0ee0c0b0 of class 'Khabar7.LatestNews' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[Khabar7.LatestNews replacementObjectForKeyedArchiver:]
2018-01-04 00:26:54.970076+0530 Khabar7[74210:3333998] Unrecognized selector -[Khabar7.LatestNews replacementObjectForKeyedArchiver:]

请告诉我是否有更好的方法来解决这个问题或我做错了什么,我可以改进我的代码。

最佳答案

要使用NSKeyedArchiver,您的类必须继承自NSObject,并且必须采用NSCoding。由于所有属性都符合属性列表,我更喜欢 JSONSerializationPropertyListSerialization

如果您使用的是 Swift 4,Codable 协议(protocol)提供了一种非常方便的方法来序列化类和结构,而无需继承 NSObject


旁注:

使用私有(private)支持变量来获取只读变量(又名常量)在 Swift 中是荒谬的。将常量声明为 let 并忘记带有前导下划线的 objective-c-ish 实例变量。

你类(class)的 Swift 方式是

class LatestNews {

let id: Int
let link: Int
let category: String
let tag: String
let headline: String
let story: String

var latestNews: LatestNews!
var latest = [LatestNews]()

init(dictionary: [String: Any]) {
id = dictionary["id"] as? Int ?? 0
link = dictionary["link"] as? Int ?? 0
category = dictionary["category"] as? String ?? ""
tag = dictionary["tag"] as? String ?? ""
headline = dictionary["headline"] as? String ?? ""
story = dictionary["story"] as? String ?? ""
}
}

关于arrays - 在设备上本地保存自定义类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48091066/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com