如何更改Swift数组中NSObject元素的属性,然后将其附加到同一数组

时间:2018-12-01 00:54:44

标签: arrays swift nsobject

我有一个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类中还有一些其他属性需要保持不变。

3 个答案:

答案 0 :(得分:0)

那是不可能的。引用类型的性质是,更改一个引用的值会更改所有引用的值。您唯一的选择是:

  1. 改为使用结构
  2. 初始化一个新对象

假设不使用结构,您可以尝试向类中添加一个方法,以将其所有值复制到新对象中:

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]