【问题标题】:'String' is not identical to 'AnyObject' error“字符串”与“AnyObject”错误不同
【发布时间】:2015-01-14 17:17:05
【问题描述】:

我在尝试通过我的应用程序中的 NSUserDefaults 将数据传递到我的 Apple Watch 应用程序时遇到问题。每当我尝试检索存储的数组时,都会收到错误'String' is not identical to 'AnyObject'

我一直在尝试找出解决方案,但我无法找出问题所在,因为我在我的应用程序的其他地方使用相同的方法并且它可以正常工作。

这是我在 Apple Watch 部分的内容:

    var defaults = NSUserDefaults(suiteName: "group.AffordIt")
    tempNames = defaults?.objectForKey("namesWatch") as NSArray
    tempDates = defaults?.objectForKey("datesWatch") as NSArray
    tempAmounts = defaults?.objectForKey("valuesWatch") as NSArray

以及包含的应用部分:

    defaults?.setObject(names, forKey: "namesWatch")
    defaults?.setObject(dates, forKey: "datesWatch")
    defaults?.setObject(values, forKey: "valuesWatch")

名称、日期和值是字符串数组。

有什么想法吗?

【问题讨论】:

  • 这种情况发生在我身上,是因为我用错了?。当我真正的意思时链接可选! - 我不在我的 Mac 前,但我会尝试一下
  • 你确定你在执行过程中没有不小心设置了一个字符串而不是一个数组吗?

标签: ios swift nsarray nsuserdefaults watchkit


【解决方案1】:

IMO 您的问题是,您尝试强制转换一个可选值,例如

if let names = defaults.objectForKey("namesWatch") as? NSArray
{
    tempNames = names
}

可能这个 SO 问题是相关的:Swift NSUserDefaults NSArray using objectForKey

【讨论】:

  • 不,因为as NSArray 解包了 Optional。
  • 是的。抱歉,被投给NSArray 的OP 没有提供任何信息让他很困惑,他想写[ String ] 虽然这对我来说应该很清楚......
【解决方案2】:

您需要将从集合中检索的对象转换为字符串:

defaults?.setObject(names, forKey: "namesWatch") as? String
defaults?.setObject(dates, forKey: "datesWatch") as? String
defaults?.setObject(values, forKey: "valuesWatch") as? String

【讨论】:

  • 收到反对票没有问题,但如果此答案有错误,请指出,以便 OP 和我都能从信息中受益。 :)
【解决方案3】:
let namesStringArray = ["John","Mary"]
let datesStringArray = ["May 21, 2009, 11:10 PM"]
let doublesStringArray = ["1.5","2.2","3.3"]

if let defaults = NSUserDefaults(suiteName: "group.AffordIt") {
    defaults.setObject(namesStringArray , forKey: "namesWatch")
    defaults.setObject(datesStringArray, forKey: "datesWatch")
    defaults.setObject(doublesStringArray, forKey: "valuesWatch")
}
let defaults = NSUserDefaults(suiteName: "group.AffordIt")
if let tempNames   = defaults!.stringArrayForKey("namesWatch") {
    println(tempNames)  // ["John", "Mary"]
}
if let tempDates   = defaults!.stringArrayForKey("datesWatch") {
    println(tempDates)  // ["May 21, 2009, 11:10 PM"]
}
if let tempAmounts = defaults!.stringArrayForKey("valuesWatch") {
    println(tempAmounts)  // ["1.5", "2.2", "3.3"]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多