如何将类变量保存在Swift中



我有类:

class Dream {
    var name: String?
    var timeStamp = Date()
}

我想保存所有变量

我正在尝试保存在 userDefaults 中 - 但这是错误的方式

我认为应该保存在 coredata 中,但我不知道该怎么做,有人可以帮助我?

var item: [Dream] = []
func addItem(nameItem: Dream) {
    item.append(nameItem)
}
func removeItem(at index: Int){
    item.remove(at: index)
}

我在ibaction中使用了func Additem

@IBAction func saveButton(_ sender: Any) {
        let image = categoryImage.image
        let data = image!.jpegData(compressionQuality: 0.5)!
        let date = Date()
        let name = date.description
        do {
            let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false)
            let fileURL = documentDirectory.appendingPathComponent(name)
            try data.write(to: fileURL)
            print(fileURL)
        } catch {
            print(error.localizedDescription)
        }
        let dream = Dream()
        dream.timeStamp = date
        dream.name = nameTextField.text
        addItem(nameItem: dream)
        navigationController?.popViewController(animated: true)
    }

您不应该在coreda或userDefaults中保存图像数据(后者只是一个.plist文件),因为图像往往很大。

您最好保存图像的String(?)值,例如可选的imageUrlString,并从中具有可选计算的var imageUrl: URL?。然后可以在应用程序加载或需要时检索图像(例如,使用PINRemoteImage [GitHub Page])。

下面是一个UserDefaults示例,其中只有一个,但是您可以存储Dream组件的字典(或使用Realm [docs]或 CoreData [docs]以存储更完整的Dream实例)

import Foundation
import UIKit
import PINRemoteImage
class Dream {
    var imageUrlString: String?
    var name: String?
    var timeStampString: String = ""
    init(fromUserDefaults: Bool) {
        if fromUserDefaults {
            self.imageUrlString = StorageService.instance.imageUrlString
            self.name = StorageService.instance.nameString
            self.timeStampString = StorageService.instance.timeStampString
        }
    }
}
extension Dream {
    var imageUrl: URL? {
        guard let imageUrlString = imageUrlString else { return nil }
        return URL(string: imageUrlString)
    }
    var timeStamp: Date? {
        //Insert logic here to return a date in the desired format, from the timeStampString - e.g.
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "en_US_POSIX") //For example
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" //For example
        guard let dateFromString = formatter.date(from: timeStampString) else { return nil }
        return dateFromString
    }
}
//Create a singleton to handle access to userDefaults safely
class StorageService {
    //MARK: Singleton
    static let instance = StorageService()
    //MARK: Private initialiser
    private init() {}
    private enum UserDefaultsKeys: String {
        case imageUrlString
        case nameString
        case timeStampString
    }
    var imageUrlString: String? {
        get {
            return UserDefaults.standard.string(forKey: UserDefaultsKeys.imageUrlString.rawValue) ?? nil
        }
        set {
            UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.imageUrlString.rawValue)
        }
    }
    var nameString: String? {
        get {
            return UserDefaults.standard.string(forKey: UserDefaultsKeys.nameString.rawValue) ?? nil
        }
        set {
            UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.nameString.rawValue)
        }
    }
    var timeStampString: String {
        get {
            return UserDefaults.standard.string(forKey: UserDefaultsKeys.timeStampString.rawValue) ?? ""
        }
        set {
            UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.timeStampString.rawValue)
        }
    }
}

然后,您可以使用pin_setImage(或其他内容)从梦境实例中加载图像,例如:

var imageView: UIImageView = {
    let img = UIImageView()
    img.pin_setImage(from: yourDreamInstance.imageUrl)
    return img
}()

最新更新