将 NSURL 数组保存到 NSUserDefaults
Saving an array of NSURL to NSUserDefaults
我有一个像这样的 NSURL 项目数组:
var array = [NSURL]()
我正在尝试将其保存到 NSUserDefaults:
let defaults = NSUserDefaults(suiteName: "group.a.project")
defaults?.setObject(array, forKey: "NSURLarray")
将导致它崩溃,因为 NSURL 无法存储在 NSUserDefaults 中。
如何将这个 NSURL 数组保存到 NSUserDefaults,以便我可以访问它并根据需要使用数组中的 NSURL(保存一个字符串数组然后尝试将它们用作 NSURL 将导致来自 xcode)?
的错误
保存时,保存url的绝对字符串。加载时使用 NSURL(URLString:) 再次将字符串转换为 url
import UIKit
class ViewController: UIViewController {
var urlsArray : [NSURL]?
func load () {
var urls : [NSURL] = []
let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as [String]?
if let array = stringsArray {
for string in array {
var url = NSURL(string: string)
urls.append(url!) //no null check
}
}
self.urlsArray = urls
}
func save () {
var strings : [String] = []
if let array = self.urlsArray {
for url in array {
var string = url.absoluteString
strings.append(string!) ////no null check
}
}
NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
}
}
使用 KVC 可以减少节省。
func save () {
var strings : [String] = []
if let array = self.urlsArray as NSArray? {
strings = array.valueForKeyPath("absoluteStrings")
}
NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
}
您可以将 URL 数组存档到 NSData 的实例并将其存储在用户默认值中。要保存:
let urls = [ NSURL(string: "http://www.google.com")!, NSURL(string: "http://www.whosebug.com")! ]
let defaults = NSUserDefaults(suiteName: "group.a.project")
let data = NSKeyedArchiver.archivedDataWithRootObject(urls)
defaults?.setValue(data, forKey: "myUrls")
加载:
if let data = defaults?.valueForKey("myUrls") as? NSData {
if let urlsArray = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [NSURL] {
println(urlsArray)
}
}
这可能会更快捷一些:
func load () {
if let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as? [String] {
self.urlsArray = stringsArray.compactMap { URL(string: [=10=]) }
}
}
func save () {
NSUserDefaults.standard.setObject(self.urlsArray.map { [=10=].absoluteString }, forKey: "stringsArray")
}
我有一个像这样的 NSURL 项目数组:
var array = [NSURL]()
我正在尝试将其保存到 NSUserDefaults:
let defaults = NSUserDefaults(suiteName: "group.a.project")
defaults?.setObject(array, forKey: "NSURLarray")
将导致它崩溃,因为 NSURL 无法存储在 NSUserDefaults 中。
如何将这个 NSURL 数组保存到 NSUserDefaults,以便我可以访问它并根据需要使用数组中的 NSURL(保存一个字符串数组然后尝试将它们用作 NSURL 将导致来自 xcode)?
的错误保存时,保存url的绝对字符串。加载时使用 NSURL(URLString:) 再次将字符串转换为 url
import UIKit
class ViewController: UIViewController {
var urlsArray : [NSURL]?
func load () {
var urls : [NSURL] = []
let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as [String]?
if let array = stringsArray {
for string in array {
var url = NSURL(string: string)
urls.append(url!) //no null check
}
}
self.urlsArray = urls
}
func save () {
var strings : [String] = []
if let array = self.urlsArray {
for url in array {
var string = url.absoluteString
strings.append(string!) ////no null check
}
}
NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
}
}
使用 KVC 可以减少节省。
func save () {
var strings : [String] = []
if let array = self.urlsArray as NSArray? {
strings = array.valueForKeyPath("absoluteStrings")
}
NSUserDefaults.standardUserDefaults().setObject(strings, forKey: "stringsArray")
}
您可以将 URL 数组存档到 NSData 的实例并将其存储在用户默认值中。要保存:
let urls = [ NSURL(string: "http://www.google.com")!, NSURL(string: "http://www.whosebug.com")! ]
let defaults = NSUserDefaults(suiteName: "group.a.project")
let data = NSKeyedArchiver.archivedDataWithRootObject(urls)
defaults?.setValue(data, forKey: "myUrls")
加载:
if let data = defaults?.valueForKey("myUrls") as? NSData {
if let urlsArray = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [NSURL] {
println(urlsArray)
}
}
这可能会更快捷一些:
func load () {
if let stringsArray = NSUserDefaults.standardUserDefaults().objectForKey("stringsArray") as? [String] {
self.urlsArray = stringsArray.compactMap { URL(string: [=10=]) }
}
}
func save () {
NSUserDefaults.standard.setObject(self.urlsArray.map { [=10=].absoluteString }, forKey: "stringsArray")
}