重置 - 问题 UIViewController

reset - issue UIViewController

我的视图控制器:

class myViewController: UIViewController {
   var myvar = 0

   func count() {
     print(myvar)
     myvar+=1 
   }

}

其他视图控制器:

Interval(1) {
  myViewController().count()
}

上面的代码是我目前得到的代码。不过好像有个大问题:

名为 myvar 的 var 进行了某种新的初始化,因此始终将其设为默认值“0”。

为什么 myViewController 在调用 myViewController().count() 后会重置?我怎样才能摆脱这种行为?

编辑:"myViewController" 以前从未加载过,也许这会导致问题?!


编辑: 除了生成实例之外,还必须有其他方法。因为多个文件正在使用多个实例,这将再次导致错误! (导致重置)

任何帮助将不胜感激:)

每次调用 myViewController().count() 时,您都在初始化 myViewController 的新实例。

我猜你应该有这样的东西:

 let myVC = myViewController()

Interval(1) {
myVC.count()
}

回答您的两个问题:

  1. 为什么:

myViewController 是你的 Class。 myViewController() 是 class 的一个实例。您可能拥有一个 class 的无限数量的实例。默认情况下,所有这些都将具有值 0。如果您希望看到其他内容而不是 0,那么您应该获得 class 的特定实例,其中您增加了 myvar 变量。

  1. 如何摆脱:

没有办法摆脱这个。这就是它的工作原理。

解决方案:请与我们分享您的业务逻辑/目标/说明您想要实现什么/您正在构建什么/最终结果是什么?

但我猜你想这样做:

let myControllerInstance = myViewController()
myControllerInstance.count()
myControllerInstance.count()
print(myControllerInstance.myvar) // expect 2 here

更新:如果它没有被调用然后调用它:)也许设置一个"initial view controller".

myViewController 是您的视图控制器实现的名称。 myViewController() 是对该视图控制器实现的初始值设定项的调用,不带任何参数。这意味着,myViewController() 创建一个新实例。您调用 myViewController().count(),这会增加值,但对于那个新创建的实例。

您在这里需要的是获取对您在屏幕上显示的单个 myViewController 实例的引用。如果不了解更多关于视图控制器的层次结构,就不可能告诉您如何获得它(尽管您现在应该知道什么是问题以及如何解决它)。

The var called myvar gets kind of new initialized

不是,它确实得到了新的初始化。

有一个常见的错误/误解:默认初始化程序 myViewController() 始终创建控制器的全新实例,它不同于所有其他实例,更重要的是,不同于故事板中设计的实例。

解决该问题的方式取决于您的设计,目前还不清楚。

问题

myViewController()

此处的这行代码创建了一个新的 myViewController 实例。 myvar 在创建 myViewController 时设置为零。这就是每次调用间隔函数时 myVar 显示为 "being reset to zero" 的原因。

var myvar = 0 //Called whenever you use myViewController()

一种更明确的方式来编写您的 class 以使其更明显:

class myViewController: UIViewController {
    var myvar: Int
    init() {
        myvar = 0
    }
...

解决方案

let vc: myViewController = myViewController()
Interval(1) {
    vc.count()
}

专业提示

欢迎来到编程世界!我为你感到非常兴奋!

坚持标准命名约定:将 myViewController 重命名为 MyViewController。

不要在名为 count 的函数中递增变量。从逻辑上讲,这是没有意义的。有人,甚至是你,以后可能会使用这个函数,而忘记了 count() 增加了那个内部变量。相反,改变计数来做到这一点,得到计数。

专业版

class MyViewController: UIViewController {
    var myvar = 0
    func count() -> Int {
        return myvar
    }
    func incrementCount() {
        myvar += 1
    }
}
...
let vc = MyViewController()
Interval(1) {
    print(vc.count())
    vc.incrementCount()
}

推荐阅读

Pure Functions

Swift style guide