【问题标题】:Why can't i change a objects attributes from a method为什么我不能从方法中更改对象属性
【发布时间】:2015-12-15 03:34:46
【问题描述】:

我用swift写了这个,我是OOP的新手:

class dis{
    var dist = 0
    func run(){
        dist += 1
    }
}

dis().run()
dis().run()
dis().run()
dis().run()
dis().run()
dis().run()

print(dis().dist())

我希望打印 6,但它打印了 0。为什么会发生这种情况以及如何解决它。

【问题讨论】:

  • 提示: 每个dis() 调用都会创建一个新实例 ...
  • 备注: 类名应以大写字母开头,例如class Dis.

标签: swift oop object methods attributes


【解决方案1】:

这就是dis().run()中发生的事情:

  • dis() 使用默认构造函数创建并返回一个“dis”对象:所有实例变量都设置为其初始值 值,在您的情况下,dist 设置为零。
  • 在此对象上调用run() 方法。该方法增加 list 的值减一,但现在 ...
  • ...对象被销毁,因为没有对其的引用。

下一个dis().run() 调用会创建一个new 对象,以此类推。

最后的print(dis().dist) 调用再次创建了一个新对象 (再次将dist 设置为零)。

您可能想要的是创建一个对象,保留对它的引用,并在此对象上反复调用run() 方法:

let d = dis()
d.run()
d.run()
d.run()
d.run()
d.run()
d.run()
print(d.dist) // 6

【讨论】:

  • 很好的解释..:)
  • @DharmeshKheni:谢谢!
【解决方案2】:

要解决这个问题:您只需让该函数返回增量编号,每次创建新的 dis() 时,计数器都会返回零。 试试这个:

class dis
{
   var dist = 0

    func run()->Int
    {
       dist += 1
       return dist
    }
 }

 var d = dis()
 print("\(d.run()) \n")  //<--- do this 6 times you will see the result 

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多