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

标签 arrays swift nsuserdefaults nskeyedarchiver

我有一个用作数组模型的自定义类。它们数组的元素是使用 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/

相关文章:

javascript - 从数组中删除项目,为什么 for 和 for in 输出不同?

ios - 加载非 http ://url scheme 后的操作

swift - iPad 应用程序的一页上有多个 Tableview

swift - 从 Swift 数组中删除元素

iphone - NSUserDefaults 是否会通过更新 Appstore 中的应用程序而持续存在?

ios - Objective-C设置bundle设置值

javascript - 查找项目是否在 JavaScript 数组中的最佳方法?

c - 使用临时变量或直接从数组更有效?

java - 如何将一行中输入的逗号分隔的数字获取到Java中的数组中

ios - 在 Swift 3 中使用表格单元格的值设置 UserDefaults