编辑/更新:
Xcode 10.1 • Swift 4.2.1 或更高版本
将图像存储在 NSUserDefaults 中并不是一个好主意,但如果您确实想要这样做,则需要将其存储为 NSData。
value参数只能是属性列表对象:NSData,
NSString、NSNumber、NSDate、NSArray 或 NSDictionary。对于 NSArray 和 NSDictionary 对象,它们的内容必须是属性列表对象
我建议将其保存到本地磁盘的文档文件夹中。如果您确实想将其保存到 NSUserDefaults,我建议仅使用小图像,并自行承担风险:) 您可以执行以下操作:
extension UserDefaults {
func set(image: UIImage?, quality: CGFloat = 0.5, forKey defaultName: String) {
guard let image = image else {
set(nil, forKey: defaultName)
return
}
set(image.jpegData(compressionQuality: quality), forKey: defaultName)
}
func image(forKey defaultName:String) -> UIImage? {
guard
let data = data(forKey: defaultName),
let image = UIImage(data: data)
else { return nil }
return image
}
func set(images value: [UIImage]?, forKey defaultName: String) throws {
guard let value = value else {
removeObject(forKey: defaultName)
return
}
try set(NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false), forKey: defaultName)
}
func images(forKey defaultName: String) throws -> [UIImage] {
guard let data = data(forKey: defaultName) else { return [] }
let object = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data)
return object as? [UIImage] ?? []
}
}
测试:
let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!))!
UserDefaults.standard.set(image: image, forKey: "imageKey")
if let loadedImage = UserDefaults.standard.image(forKey: "imageKey") {
print(loadedImage.size) // "(719.0, 808.0)"
}
let images = [image, image]
try? UserDefaults.standard.set(images: images, forKey: "imagesKey")
if let loadedImages = try? UserDefaults.standard.images(forKey: "imagesKey") {
print(loadedImages.count) // 2
}