在 swift 中转换可变数组仍然被认为是不可变的
casting mutable array is still considered non-mutable in swift
我尝试将 AnyObject 数据转换为可变数组,但它仍然像非可变数组一样工作,并且在尝试对其进行变异后 运行-time 崩溃。有人可以解释一下吗?
就像我从 JSON 获取一些数据,我知道它将是数组数据类型(我将其命名为数据),现在我将其转换为可变数组,假设如下:
let mutArray: NSMutableArray = data as! NSMutableArray
但是当我稍后尝试改变它时,mutArray 仍然是一个不可改变的数组。几个月前这段代码运行良好,现在它出现了问题,比如我正在尝试改变一个不可变的数组。
那是因为转换实际上并没有以任何方式改变一个对象,它只是告诉编译器它是某种类型。换句话说,它只会影响代码的类型检查方式,实际上并不会改变代码在运行时的行为。要实际将 NSArray
更改为 NSMutableArray
,您需要:
let mutArray = NSMutableArray(array: data)
这一行实际上创建了一个新的 NSMutableArray
并用您的 data
数组填充它。
如果您的代码之前有效,那么出于某种原因,您的原始数据必须 已经 成为 NSMutableArray
。 NSArray
s 秘密地成为 NSMutableArray
s 实际上是很常见的(尽管从任何给定方法依赖这个事实当然是一个坏主意,因为正如我们刚刚了解到的那样,它可以随时改变片刻)。
我尝试将 AnyObject 数据转换为可变数组,但它仍然像非可变数组一样工作,并且在尝试对其进行变异后 运行-time 崩溃。有人可以解释一下吗?
就像我从 JSON 获取一些数据,我知道它将是数组数据类型(我将其命名为数据),现在我将其转换为可变数组,假设如下:
let mutArray: NSMutableArray = data as! NSMutableArray
但是当我稍后尝试改变它时,mutArray 仍然是一个不可改变的数组。几个月前这段代码运行良好,现在它出现了问题,比如我正在尝试改变一个不可变的数组。
那是因为转换实际上并没有以任何方式改变一个对象,它只是告诉编译器它是某种类型。换句话说,它只会影响代码的类型检查方式,实际上并不会改变代码在运行时的行为。要实际将 NSArray
更改为 NSMutableArray
,您需要:
let mutArray = NSMutableArray(array: data)
这一行实际上创建了一个新的 NSMutableArray
并用您的 data
数组填充它。
如果您的代码之前有效,那么出于某种原因,您的原始数据必须 已经 成为 NSMutableArray
。 NSArray
s 秘密地成为 NSMutableArray
s 实际上是很常见的(尽管从任何给定方法依赖这个事实当然是一个坏主意,因为正如我们刚刚了解到的那样,它可以随时改变片刻)。