我是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
正如我所说,非常奇特...... 感谢您阅读我的问题,当然还要回答(:
答案 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对象的副本
希望它有所帮助!!