环境XCode 6.4 Swift 2.something
我有两个简单的自定义类
class Stock {
var ageArray = [3,6,9,12,15,18,24,30,36,42,48,54,60,66,72] // in months
var beastArray = ["Angus","Braford","Charolais","Droughtmaster","Euro","Hereford"]
var breedArray = ["Calves","Vealers","Weaners","Heifers","Steers","Cows","Bulls"]
var priceArray = [600.00,650.00,700.00,750.00,800.00,850.00,900.00,950.00,1000.00,]
}
和
class Sale {
var age : Int = 0
var beast : String = " "
var breed : String = " "
var price : Double = 0.00
}
现在到我的视图控制器
我实例化了Sale Class的报告。正如我在多个地方所教的那样,ViewController包含所有这些报告的数组,首先声明它,然后在viewDidLoad中对其进行实例化
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var picker: UIPickerView!
var report = Sale()
var sheets = Stock()
var saleArray : [Sale] = [] // declaration
override func viewDidLoad() {
super.viewDidLoad()
saleArray = [Sale]() // instantiating
}
选择器的其他委托函数可以很好地工作,无需在此处全部显示它们,但这是两个类对象相遇以传递值的地方
func pickerView(picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch(component) {
case 0:
report.breed = sheets.breedArray[row]
break
case 1:
report.beast = sheets.beastArray[row]
break
case 2:
report.age = sheets.ageArray[row]
break
default:
report.price = sheets.priceArray[row]
break
}
}
然后屏幕上的按钮将它们加载到数组中
@IBAction func AcceptValues(sender:UIButton) {
saleArray.append(report)
}
这里的所有都是它的。
这是在调试器中看到的结果,其断点设置为以下3次,如下所示:[0]应该具有Angus Calves,而[1]应该具有Droughtmaster Heifers
所以问题是为什么saleArray会填充n个最后输入的实例?我知道我没有看最后一次录入n次。但是奇怪的是报告地址在7A19C000都是一样的。
我以为可能是因为编译器无法在viewDidLoad中出现状态后推断数组类型。检查各种教程及其随附的代码或多或少会像我上面所述。这就是标题的原因,我敢肯定,Swift可以容纳除平常对象之外的其他对象数组。
我什至花了很多钱去购买一本,而不是马特·诺伊伯格(Matt Neuberg)的两本书,以检查如何设置对象数组,但是像所有可用材料一样,他们只讨论了Int和Double和String数组,而没有更多内容了。 。有时候,最令人发指的错误是您面世时盯着你的眼睛,而我一直在追赶它,一周了。
代码几乎没有其他内容。
编辑:感谢下面的两个贡献者,这些注释显示了我为使其工作而做的事情。但是我有一种不优雅的感觉:我也将Stock构造为一个结构。
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var picker: UIPickerView!
@IBOutlet weak var textPanel: UITextView!
var sheets = Stock()
var saleArray : [Sale] = []
var localBreed = " " // introduced some handover values
var localBeast = " " // because report is out of scope
var localAge = 0 // in the picker functions
var localPrice = 0.00
。。。
@IBAction func AcceptValues(sender:UIButton) {
var report = Sale() // new reports instantiated here
report.breed = localBreed // and locals handover values to
report.beast = localBeast // report instance before adding
report.age = localAge // to array
report.price = localPrice
saleArray.append(report)
}
。。。
func pickerView(picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch(component) {
case 0:
localBreed = sheets.breedArray[row]
break
case 1:
localBeast = sheets.beastArray[row]
break
case 2:
localAge = sheets.ageArray[row]
break
default:
localPrice = sheets.priceArray[row]
break
}
}
我相信这是因为report
是的一个实例Sale
。因此,每次选择新的组合时-您不是在创建新的Sale
项目,而是在更改与Sale
被称为的单个实例相关联的值report
。当您按下按钮时,它将为该单个report
实例添加另一个引用。
这些类对象通过引用传递-即,当您添加report
到时,saleArray
它不是在创建值的副本-而是将引用传递给实际实例。每次按下按钮时,您都会添加对的相同实例的引用Sale
。然后,当您使用选择器时,与该实例关联的值将被更改。一遍又一遍是同一实例。
您将需要更改代码,以便Sale
为每个选择创建一个新的实例。为了快速进行测试,您可以将代码添加到按钮中,以Sale
根据所选的值创建一个新实例,然后将其添加到中,以进行测试saleArray
。
ETA-我注意到的另一件事:您saleArray
在//declaration
和实例化了两次viewDidLoad()
。尽管这没有引起您描述的问题,但是在潜在的情况下可能会引起问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句