更改数组中的一个元素会更改数组中的所有元素

时间:2017-07-28 13:06:59

标签: arrays swift

我是Swift的新手,我正试图搞砸一些UITableViews和Arrays。

我有一个[Day]类型的数组,名为daysArray。 我正在ViewDidLoad()中启动数组,daysArray中有7“天”。

另外,我有UITableView,其中填充了daysArray。 当我试图改变一天(数组中的一个元素)时,整个daysArray天都会改变,因此UITableView中的所有单元都是相同的。
这太奇特了,我真的不知道出了什么问题(:

日班:

import Foundation

class Day {

    private var _name: String!
    private var _starts: Double!
    private var _ends: Double!

    var name: String! {
        get {
            if _name == nil {
                _name = "Sunday"
            }
            return _name
        }
        set {
            _name = newValue
        }
    }

    var starts: Double! {
        get {
            if _starts == nil {
                _starts = 8.00
            }
            return _starts
        }
        set {
            _starts = newValue
        }
    }
    var ends: Double! {
        get {
            if _ends == nil {
                _ends = 20.00
            }
            return _ends
        }
        set {
            _ends = newValue
        }
    }

    init(dayDict: Dictionary<String, AnyObject>) {
        if let dictName = dayDict["name"] as! String! {
            self._name = dictName
        }
        if let dictIsWorking = dayDict["isWorking"] as! Bool! {
            self._isWorking = dictIsWorking
        }
        if let dictStarts = dayDict["starts"] as! Double! {
            self._starts = dictStarts
        }
        if let dictEnds = dayDict["ends"] as! Double! {
            self._ends = dictEnds
        }
    }
}

似乎有问题的代码是:

import UIKit


let GeneralDayDict: [String : AnyObject] = ["name" : "Sunday" as AnyObject, "starts": 8.00 as AnyObject, "ends" : 20.00 as AnyObject]
let someDay: Day = Day(dayDict: GeneralDayDict)



class ViewController: UIViewController {

    var daysArray: [Day]! = []

    override func viewDidLoad() {
        super.viewDidLoad()

        for i in 0...6 {
            let generalDay: Day = someDay
            daysArray.append(generalDay)

        }
        changeArray()

        // Do any additional setup after loading the view, typically from a nib.
    }

    func changeArray() {
        daysArray[5].starts = 6.00
        for day in daysArray {
            print("Each day in the array starts at: ", day.starts)
        }


    }
}

changeArray中的print命令打印出:

Each day in the array starts at:  6.0
Each day in the array starts at:  6.0
Each day in the array starts at:  6.0
Each day in the array starts at:  6.0
Each day in the array starts at:  6.0
Each day in the array starts at:  6.0
Each day in the array starts at:  6.0

正如我所说,非常奇特...... 感谢您阅读我的问题,当然还要回答(:

3 个答案:

答案 0 :(得分:3)

在循环中,使用相同的引用实例化对象。 你必须替换:

let generalDay: Day = someDay

由此:

let generalDay = Day(dayDict: GeneralDayDict)

然后您将能够单独更改generalDay的属性

答案 1 :(得分:1)

Swift中的类通过引用传递。意味着数组中的每个项目都指向同一个东西。因此,当您更新一个时,您将全部更新它们。

尝试使用结构而不是使用类来执行此操作,您将看到差异。

请参阅此Documentation以获得更好的解释及其背后的原因。

答案 2 :(得分:1)

将Day类设置为NSObject

class Day : NSObject {

}

 for i in 0...6 {
        let generalDay: Day = someDay
        daysArray.append(generalDay.copy())

    }

然后只需附加generalDay对象的副本

希望它有所帮助!!