【问题标题】:Why inherited variable is not initialized in swift?为什么继承的变量没有在swift中初始化?
【发布时间】:2016-10-07 10:39:17
【问题描述】:

我有一个名为 RootViewController 的主 UIViewController

import UIKit
class RootViewController: UIViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

还有 2 个名为 oneViewController 和 twoViewController 的子控制器继承 RootViewController 为:(另请阅读我的 cmets)

import UIKit
class oneViewController: RootViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        amIaccessible = true // I have initialized this variable of RootViewController 
    }
}

import UIKit
class twoViewController: RootViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        print(amIaccessible) // it should print true as initialized in oneViewController but its printing false :(
    }
}

现在的问题是,我的 oneViewController 是我的应用程序的初始视图,而 twoViewController 是在第一个视图之后初始化的第二个视图,所以我希望 RootViewController 成为我的单例类型控制器,它可以在整个应用程序生命周期中保存我的变量和方法。我怎样才能做到这一点?

我不需要像单独的单例类这样的解决方案,我知道这样也像制作一个可以在整个应用程序执行过程中保存变量的共享实例。 所以请给我使用继承关系的解决方案

【问题讨论】:

  • 将变量放在视图控制器而不是单独的模型对象(我当然会推荐)中的问题是您无法控制视图控制器的生命周期。 iOS 可以随意创建和销毁它们,对此您无能为力。如果您想使对该单例对象的访问变得透明,请将计算属性或函数添加到您的基本视图控制器以隐藏对集中式单例的访问。
  • 您对类继承的工作方式存在误解。 RootViewController 不是单身人士。它只是其他两个视图控制器中的每一个的超类。每个视图控制器都有自己的由RootViewController 声明的属性实例,在一个视图控制器实例中更改super.amIaccessible 不会更改其在另一个实例中的值。

标签: ios swift inheritance


【解决方案1】:

以下是您应该研究的一些事项

class oneViewController: RootViewController {
var amIaccessible: Bool = false // here you are overridding the amIaccessible property. so if you will use this with oneViewController object it will always gives you overridden property value

override func viewDidLoad() {
    super.viewDidLoad()
    amIaccessible = true // here you are changing the overridden amIaccessible property value. if you want to change super class propert value you should use super keyword.
    print(self.amIaccessible) // true
    print(super.amIaccessible) // false


   // for e.g  super.amIaccessible = true // in the same way access it with super keyword.
 }
}

如果在 twoViewController 中,如果你想访问 RootViewController 的 amIaccessible 属性,你必须使用 super 属性,如果你从 oneViewController 更改 amIaccessible 属性的值,你不能在 @987654325 中获得相同的值@ 因为对于每个对象,iOS 都会创建新属性并在从内存中释放时将其杀死。

class twoViewController: RootViewController {
var amIaccessible: Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
    print(super.amIaccessible) // it will always gives you false
}

}

【讨论】:

    【解决方案2】:

    我已经想通了,要访问其他视图控制器中的 RootViewController 变量,那么我应该将它们设为静态:

    import UIKit
    class RootViewController: UIViewController {
        static var amIaccessible: Bool = false  // make this static
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    

    访问父类的amIaccessible为RootViewController.amIaccessible

    import UIKit
    class oneViewController: RootViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            RootViewController.amIaccessible = true // I have initialized this variable of RootViewController 
        }
    }
    
    import UIKit
    class twoViewController: RootViewController {
        var amIaccessible: Bool = false
    
        override func viewDidLoad() {
            super.viewDidLoad()
            print(RootViewController.amIaccessible) // it is printing true now
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2010-09-29
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2014-08-23
      • 2012-02-23
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多