【问题标题】:Converting [NSURL] into [String] for NSUserDefaults?将 [NSURL] 转换为 NSUserDefaults 的 [String]?
【发布时间】:2016-03-12 18:00:57
【问题描述】:

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

这是我的代码....

// 像这样保存....

vc.videoImageArry = defaults.setObjectForKey("vidImages)

//像这样检索......

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

【问题讨论】:

  • 您可以将数组保存到用户默认值中。你有什么问题?
  • Mr.T.... 我无法保存 NSURL 数组; R P 我正在尝试转换 NSURL 的数组并重新转换为字符串

标签: swift casting nsuserdefaults transitions


【解决方案1】:

使用 NSData

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

func save(urls: [NSURL]) {
    let urlsData = urls.map { $0.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: $0, relativeToURL: nil) }
}

使用字符串

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

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

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

正如下面的 cmets 中所讨论的,如果使用 save 函数将数据写入 NSUserDefaults,我们知道数组的每个元素都是一个 String,代表一个有效的 @ 987654332@.

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

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

【讨论】:

  • 可以说,它可能应该是 [NSURL?]?,因为这是 NSURL(string:) 初始化程序返回的内容。
  • 嗯,实际上,想一想,原来的答案可能很好......我忘记了 flatMap 做了什么......这使得它不是可选的(删除任何 nil 值) .从理论上讲,由于我们还通过传入有效的NSURL 对象数组进行保存,因此flatMap 永远不应该删除任何东西......只需将它们全部解开......
  • 是的,如果数据是专门用save 函数写入的,urlsData 的每个元素都应该包含一个String,代表一个有效的NSURL。我应该放回以前的版本吗?
  • 我想是的,是的。或者也许更新您的答案以包括两个选项和解释差异的评论。无论哪种方式,我都赞成这个答案。
【解决方案2】:

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($0) }
let backToUrls = strings.map { NSURL(string: $0)! }

我相信以上回答了您的具体问题。

话虽如此,我认为保存的行不合适。您可能想进一步了解NSUserDefaults,或者如果您对该行有疑问,请提出单独的问题。您需要粘贴更多上下文,例如上面和下面的行以及您收到的确切错误消息(如果有)。

【讨论】:

  • 我会试试这个。我正在正确保存所有字符串和整数。我对映射和 $ 名称不太熟悉。在你和 appzYourLife 之间,我想我明白了。如果您知道任何用于映射的好资源,那就太好了。
猜你喜欢
  • 2016-01-12
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2016-08-15
  • 2014-12-18
  • 1970-01-01
相关资源
最近更新 更多