在Swift上无法将映射对象的数组设置/获取为userDefaults

时间:2018-11-12 18:34:23

标签: ios arrays swift getter-setter

我一直在搜索Stack Overflow,但没有答案可以解决这个问题。

我正在解析一个数组,并检索数据,但是我一直在尝试设置/获取它,因为在将其设置为userDefaults之前,我需要将其设置为NSArray或其他内容

这是我的设置者/获取者:

?quasiquotation

我的GalleryCacheType和UserDefaultServiceType,它们是协议:

import Foundation

private extension UserDefaultsKey {
    static var galleryKey: Key<GalleryImage> {
        return "images"
    }
}

class GalleryCache: GalleryCacheType {

    private let userDefault: UserDefaultsServiceType

        var imageUrl: [GalleryImage]? {
        get {
            if let userDefaultValue = self.userDefault.value(forKey: .galleryKey) {
                return userDefaultValue
            }
            return nil
        }
        set {
            if let newValue = newValue {
                let urlData = NSKeyedArchiver.archivedData(withRootObject: newValue)
                userDefault.set(value: urlData, forKey: .galleryKey)
            }
        }
    }

    init() {
        let customUserDefault = UserDefaults(suiteName: "pictures")
        self.userDefault = UserDefaultsService(customUserDefault: customUserDefault)
    }
}

实现UserDefaultProtocols的类:

protocol GalleryCacheType {

    var imageUrl: [GalleryImage]? { get set }

}

GalleryImage本身:

import Foundation

final class UserDefaultsService: UserDefaultsServiceType {

    private var customUserDefault: UserDefaults?

    init(customUserDefault: UserDefaults?) {
        self.customUserDefault = customUserDefault
    }

    private var defaults: UserDefaults {
        if let custom = self.customUserDefault {
            return custom
        }
        return UserDefaults.standard
    }

    func value<T>(forKey key: UserDefaultsKey<T>) -> T? {
        return self.defaults.value(forKey: key.key) as? T
    }

    func set<T>(value: T?, forKey key: UserDefaultsKey<T>) {
        self.defaults.set(value, forKey: key.key)
    }
}

The errors Xcode is showing me are the following

1 个答案:

答案 0 :(得分:0)

如@rmdaddy所述,将数据存储在UserDefaults上并不是很好,因此,与其将其保存到UserDefaults,还将其存储在适当的沙箱中(我特别喜欢Realm)。 / p>