[英]How can I save class variables in 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)
}
你真的不應該在 CoreData 或 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
(或其他東西)從pin_setImage
實例中的任何需要的地方加載圖像,例如:
var imageView: UIImageView = {
let img = UIImageView()
img.pin_setImage(from: yourDreamInstance.imageUrl)
return img
}()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.