【问题标题】:How to build an array in swift re-using a variable如何快速重新使用变量构建数组
【发布时间】:2014-09-29 20:19:29
【问题描述】:

我计划使用类对象变量来捕获用户在循环周期中输入的数据集,并在数据集完成后将其添加到包含所有这些类变量的数组中。 Playground 中的简单示例代码:

class Example {
    var a = 1
    var b = 5
}

var exArray = [Example] () //  this is the array holding the class variables
var anExample = Example () // default-init the "re-usable" variable

exArray.append(anExample)

exArray[0].a // results in 1 as expected
exArray[0].b //  results in 5 as expected
exArray.count // 1 as expected

// now changing the re-usable variable properties with new user entered data

anExample.a = 3
anExample.b = 7

// appending the altered variable

exArray.append(anExample)

exArray[0].a // shows 3 where I still expect 1
exArray[0].b // shows 7 where I expect 7
exArray.count // shows 2 as expected

似乎数组包含变量本身(指针?)而不是变量的副本,所以这在数组中不断变化。有什么想法可以在不更改数组成员的情况下“重置”类变量吗?

【问题讨论】:

  • 在设置新属性值之前创建一个新的 Example 实例。 anExample = Example() anExample.a = 3 anExample.b = 7
  • 谢谢,弗朗西斯库。要创建一个新实例,我必须给变量另一个名称,因此无法访问同名变量。如果我使用相同的名称,我无法“重新实例化”它,因此更改 a 或 b 等属性仍会更改原始类对象 anExample 即使作为数组的成员 - 这是我不想要的跨度>
  • 你可以按照我说的去做。但是如果你不想像我建议的那样在同一个变量名中创建另一个实例,你应该考虑使用 Struct 而不是 Class。正如 Swift 语言参考中所述,Struct 是通过它们的值传递的,而 Classes 是通过它们的引用传递的。
  • 最终做到了,效果很好,谢谢

标签: ios iphone arrays swift


【解决方案1】:

如果您创建一个类的实例并分配给一个变量,则该变量包含对实例的引用,而不是实例本身。

当您将变量添加到数组时,您添加了对类实例的引用。如果您稍后更改实例属性并添加到数组中,您添加的引用与之前添加的引用相同。结果:您插入到数组中的所有内容都是一个包含对同一类实例的引用的变量。

根据您的应用架构和逻辑,您可能希望将类转换为结构 - 与作为引用类型的类不同,结构是值类型,因此当移动时,它的副本是创建的。这种情况发生在:

  • 您将变量分配给另一个变量
  • 您将其传递给函数或方法(除非使用了inout 修饰符)

直接的结果是,如果你将一个结构实例插入到一个数组中,你就会调用一个方法,因此会创建一个结构的副本并将其插入到数组中——该副本与原始结构没有任何关系,除了具有复制时相同的值。因此,您对其中任何一个所做的任何更改都不会反映到另一个。

【讨论】:

    【解决方案2】:

    如果您希望在分配时复制数据,您可以将Example 定义为struct 而不是class See this answer for the difference between struct and class

    struct Example {
        var a = 1
        var b = 5
    }
    

    现在,当您将其分配给数组时,它会将 copy 添加到数组,其中包含您分配给它的点的数据。


    但是,如果您想继续使用 class,您应该先创建一个包含所需数据的新实例,然后再将其附加到数组中。

    【讨论】:

    • 非常感谢 Alex 和 Antonio。我想要继承类,但有解决方法选项。将尝试改用 struct 并反馈它是如何工作的
    • 我已经尝试了 struct 选项;这会给类中的函数/方法带来问题,因为 struct 方法似乎无法从内部修改 self 属性(这是 Xcode 列出的错误代码)。因此,为每个数组成员应用了单独的类对象的实例化。这确实很好用,虽然它看起来不是很优雅。再次感谢您的建议
    • 将你的结构体方法定义为mutating func,这些方法将能够改变它们自己的结构体。
    猜你喜欢
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多