我有一个NSObject类,如下所示:
class Number: NSObject {
var number: Int = 0
init(newNumber: Int) {
self.number = newNumber
}
}
然后我要创建一个Number
对象的数组,如下所示:
var numbersArr = [Number(newNumber: 1), Number(newNumber: 2)]
现在,我想更改现有数组元素的number
属性,并将其附加为新元素。我这样做:
var newItem = numbersArr[1]
newItem.number = 4
numbersArr(newItem)
我希望numbersArr
的新值是[1, 2, 4]
,但我得到的是[1, 4, 4]
。
我知道我要更改现有元素的值,而不是创建一个新元素然后附加它。但是我怎样才能达到预期的效果呢?
我无法初始化新的Number
对象然后附加它。我实际的NSObject类中还有一些其他属性需要保持不变。
答案 0 :(得分:0)
那是不可能的。引用类型的性质是,更改一个引用的值会更改所有引用的值。您唯一的选择是:
假设不使用结构,您可以尝试向类中添加一个方法,以将其所有值复制到新对象中:
class Number: NSObject {
var number: Int = 0
init(newNumber: Int) {
self.number = newNumber
}
func copy () -> Number {
return Number(newNumber: self.number)
}
}
然后:
let newItem = numbersArr[1].copy()
newItem.number = 4
numbersArr.append(newItem) // [1, 2, 4]
答案 1 :(得分:0)
在处理引用类型时,您的问题很常见。您是numbersArr
的索引1和2指向同一个对象,因此,当您修改一个对象时,您也会更改另一个对象。
您需要制作一个深层副本:
class Number: NSObject, NSCopying {
var number: Int = 0
init(newNumber: Int) {
self.number = newNumber
}
func copy(with zone: NSZone? = nil) -> Any {
return Number(newNumber: self.number)
}
}
var numbersArr = [Number(newNumber: 1), Number(newNumber: 2)]
let newItem = numbersArr[1].copy() as! Number
newItem.number = 4
numbersArr.append(newItem)
答案 2 :(得分:0)
与Jhon Montgomery的解决方案几乎相同,但对其进行了少量更新。
func copy () -> Number {
let number = Number(newNumber: self.number)
//Copy your all other NSObject properties here
//Example
number.example = self.example
return number
}
现在尝试,
let newItem = numbersArr[1].copy() // Here it copies your number with all NSObject properties.
newItem.number = 4
numbersArr.append(newItem) // [1, 2, 4]