将 [NSURL] 转换为 NSUserDefaults 的 [String]?

Converting [NSURL] into [String] for NSUserDefaults?

我正在将图像作为 NSURL 数组保存到 Parse Data 中。一旦我将它们放回我的应用程序中,我想将它们转换为 [String] 以便我的应用程序可以临时存储它们。有什么想法吗?

这是我的代码....

// 像这样保存....

vc.videoImageArry = defaults.setObjectForKey("vidImages)

//像这样检索....

vc.vidImageArray = defaults.objectForKey("vidImages") as! [NSURL]

使用 NSData

您可以将每个 NSURL 转换为 NSData 以保存它

func save(urls: [NSURL]) {
    let urlsData = urls.map { [=10=].dataRepresentation }
    NSUserDefaults.standardUserDefaults().setObject(urlsData, forKey: "urlsData")
}

稍后您可以检索 NSData 数组并将其转换回 [NSURL]

func load() -> [NSURL]? {
    let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [NSData]
    return retrievedData?.map { NSURL(dataRepresentation: [=11=], relativeToURL: nil) }
}

使用字符串

或者您可以将网址另存为 String(s)

func save(urls: [NSURL]) {
    let urlsData = urls.map { [=12=].absoluteString }
    NSUserDefaults.standardUserDefaults().setObject(urlsData, forKey: "urlsData")
}

func load() -> [NSURL?]? {
    let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [String]
    return retrievedData?.map { NSURL(string: [=12=]) }
}

正如下面评论中所讨论的,如果数据写入 NSUserDefaults 独占 使用 save 函数,我们知道数组的每个元素是代表有效 NSURL.

String

因此我们可以使用 load 的替代版本将 load 的 return 类型从 [NSURL?]? 更改为 [NSURL]?

func load() -> [NSURL]? {
    let retrievedData = NSUserDefaults.standardUserDefaults().arrayForKey("urlsData") as? [String]
    return retrievedData?.flatMap { NSURL(string: [=13=]) }
}

要从 NSURL 转换为 String:

String(url)

要从 String 转换为 NSURL:

NSURL(string: string)

这是一个可以双向转换数组的完整示例:

import Cocoa
let urls = [NSURL(string: "http://www.swift.org/")!, NSURL(string: "http://www.apple.com/")!]
let strings = urls.map { String([=12=]) }
let backToUrls = strings.map { NSURL(string: [=12=])! }

我相信以上内容可以回答您的具体问题。

话虽如此,我觉得保存行不对。您可能想进一步研究 NSUserDefaults 或在遇到该行问题时提出单独的问题。您需要粘贴更多上下文,例如上面和下面的行以及您收到的确切错误消息(如果有)。