对象类型的变量作为数组行为异常

竞技场

环境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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

不能使用 __PHP_Incomplete_Class 类型的对象作为数组。致命错误异常

来自分类Dev

Typescript数组对象属性值作为类型

来自分类Dev

打印数组时,SimpleXMLElement对象中的异常行为

来自分类Dev

Shell变量$ _行为异常

来自分类Dev

(数组)类型将奇怪的行为对象转换为数组转换

来自分类Dev

数组/哈希异常行为

来自分类Dev

数组的异常行为

来自分类Dev

NodeJS数组的异常行为

来自分类Dev

数组公式行为异常

来自分类Dev

KDB Real类型的异常行为

来自分类Dev

将导入的变量作为参数时,“ os”包中的某些函数行为异常

来自分类Dev

Makefile中的变量,异常行为

来自分类Dev

AJAX发布变量行为异常

来自分类Dev

您如何类型检查“作为常量”的数组变量?

来自分类Dev

JavaScript的Set对象的异常行为

来自分类Dev

PHP DateTime对象的异常(?)行为

来自分类Dev

Mongoose 模型对象行为异常

来自分类Dev

致命错误:无法使用 Stripe\Customer 类型的对象作为数组

来自分类Dev

不能使用 WP_Term 类型的对象作为数组

来自分类Dev

不能在 Laravel 中使用 stdClass 类型的对象作为数组

来自分类Dev

致命错误:无法使用 SplFileInfo 类型的对象作为数组

来自分类Dev

导出 CSV 不能使用 stdClass 类型的对象作为数组

来自分类Dev

解析数组时的异常行为

来自分类Dev

javascript多维数组行为异常

来自分类Dev

数组元素行为异常

来自分类Dev

对象数组的“ subsref”行为

来自分类Dev

将具有变量作为属性名称的对象推入数组

来自分类Dev

将具有变量作为属性名称的对象推入数组

来自分类Dev

使用变量作为数组中的对象属性名称?

Related 相关文章

热门标签

归档