【问题标题】:Ambiguous use of 'subscript' while appending array in Swift 2.2在 Swift 2.2 中附加数组时模糊使用“下标”
【发布时间】:2016-04-18 20:07:27
【问题描述】:

我不得不花几个月的时间来编写代码,并且我正在努力让我的应用程序保持最新状态。在 Xcode 7.3 中打开此项目后,我在此行收到“Ambiguous use of 'subscript'”错误:

words.append(storedWords[i] as! String)

完整的声明在这里:

@if let storedWords : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("customWords") {
        words = []
        for var i = 0; i < storedWords.count; ++i {
            words.append(storedWords[i] as! String)
        }
    }

我见过一些类似的问题,但处理的类似。但不同的情况。我已经尝试调整其中的许多建议,但没有看到直接应用于此代码。如果我错了,请指出正确的方向。

这段代码在更新之前运行良好,我确信由于 Swift 2.2 对它的语法进行了简单的调整,但到目前为止还没有任何效果。

谢谢。

【问题讨论】:

  • 仅供参考,这种 for 循环的风格已被弃用
  • 谢谢,我在 Xcode 中看到了该通知,一旦我修复了这个错误,我需要通过并更新所有已弃用的代码。 ;-)
  • 没问题。只是传播 Swift 3.0 的好消息!

标签: arrays swift for-loop nsuserdefaults swift2.2


【解决方案1】:

这似乎是由于使用了AnyObject。您可能想使用

if let storedWords = NSUserDefaults.standardUserDefaults().objectForKey("customWords") as? [String] {
    words = [String]()
    for word in storedWords {
        words.append(word)
    }
}

因此,将存储的单词作为字符串数组从用户默认值中提取出来,并安全地迭代它们,知道它们都必须是字符串。

但是,如果这就是您所做的全部,您可以大大简化为:

let words = NSUserDefaults.standardUserDefaults().objectForKey("customWords") as? [String] ?? []

如果存在则将words设置为字符串数组,否则为空数组,无需迭代即可将所有元素添加到新数组中。

【讨论】:

  • 这里for循环的目的是什么?不是和 words = storedWords 一样吗?
  • @PEEJWEEJ 我不确定问题中的代码是否是一个简化的示例,因此想包含一个带有工作迭代的示例,以防他们实际上想在循环中做一些更复杂的事情。但同意,在这种情况下,循环是完全没有必要的。
  • 太棒了!非常感谢您的快速回答。并为您简化我的代码。我从大约一年前做的一个项目中提取了 for 循环,当时我开始学习并且从未想过要对其进行返工。非常感谢!
  • @GeorgeGreen 好酷。想确保我不会发疯:)
【解决方案2】:

我已将您的代码更新到最新的 Xcode 7.3

var words = Array<AnyObject>()

    if let storedWords : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey("customWords") {

        words = []

        for i in 0 ..< storedWords.count {

            words.append(storedWords[i] as! String)
        }
    }

【讨论】:

  • 感谢其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2016-02-12
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
相关资源
最近更新 更多