【问题标题】:casting mutable array is still considered non-mutable in swift转换可变数组在swift中仍然被认为是不可变的
【发布时间】:2016-11-26 18:04:43
【问题描述】:

我尝试将 AnyObject 数据转换为可变数组,但它仍然像非可变数组一样工作,并在尝试对其进行变异后在运行时崩溃。有人可以解释一下吗?

就像我从 JSON 获取一些数据并且我知道它将是 Array 数据类型(我将其命名为数据),现在我将其转换为可变数组,假设如下:

让 mutArray: NSMutableArray = data as! NSMutableArray

但是当我稍后尝试对其进行变异时, mutArray 仍然保留为非可变数组。这段代码几个月前工作得很好,现在它给出了一些问题,比如我试图改变一个非可变数组。

【问题讨论】:

  • 您介意添加一些代码,让您的步骤更清晰吗?
  • @FishStix:您好,我再次编辑了我的问题。希望我现在能够更好地解释它?!
  • 请告诉我们data是如何填充的
  • @appzYourLife:我通过 JSON 获取它。所以它是一个字典,使用一个键我得到“数据”

标签: arrays swift xcode swift2 nsmutablearray


【解决方案1】:

那是因为强制转换实际上并不会以任何方式改变对象,它只是告诉编译器它属于某种类型。换句话说,它只影响代码的类型检查方式,实际上并没有改变代码在运行时的行为。要将NSArray 实际更改为NSMutableArray,您需要:

let mutArray = NSMutableArray(array: data)

这一行实际上创建了一个新的NSMutableArray 并用您的data 数组填充它。

如果您的代码之前有效,那么出于某种原因,您的原始数据必须已经NSMutableArray。实际上,NSArrays 秘密地成为NSMutableArrays 是很常见的(尽管从任何给定的方法中依赖这一事实当然是一个坏主意,因为正如我们刚刚了解到的那样,它随时可能改变)。

【讨论】:

  • 好的,但同样的事情以前有效,但现在不行。是不是 Swift 的内存结构发生了变化?我只是想更好地理解这一点,这就是为什么这么多问题。
  • @Max_Rai:已编辑。基本上,你以前很幸运。
  • 知道了。感谢您的宝贵时间!
猜你喜欢
  • 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
相关资源
最近更新 更多