Swift:如何声明一个类的静态成员变量

时间:2016-04-11 19:44:23

标签: ios swift

我试图声明一个具有静态变量的类,我希望将其设置为该类的对象,即

class MyViewController: UIViewController {
      @IBOutlet weak var title: UILabel!

      static var staticSelf:MyViewController

此声明会生成以下错误:

"class var declaration requires an initializer expression or getter/setter specifier".

所以我尝试了多次尝试添加初始化器,但只是获得了更多或不同的编译错误。所以我尝试在错误中添加一个getter / setter说明符,但这会在运行时产生无限循环。我尝试了几个版本,这是最新版本:

class MyViewController: UIViewController {

  @IBOutlet weak var title: UILabel!

  static var staticSelf:MyViewController {
    set (selfInstance) {
        MyViewController.staticSelf = selfInstance
    }
    get {
        return MyViewController.staticSelf
    }
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    MyViewController.staticSelf = self
  }
}

实现setter方法的初始尝试是staticSelf = selfInstance,XCode将此标记为错误并自动更正为self.staticSelf = selfInstance,但这会导致infinate循环,因此我将其更改为MyViewController.staticSelf = selfInstance,但这也会产生一个无限循环。

我已经尝试了很多东西来完成这个设置并且可以在3秒内使用Objective-C完成它,并且我现在对Swift非常厌倦。

3 个答案:

答案 0 :(得分:9)

基本示例

class MyClass {
    static var string: String
}

不起作用,因为单元化变量的值为nil。但是,在Swift中,您只能将nil分配给可选变量。

您有两种选择:

  1. 将变量声明为可选

    static var string: String?
    

    static var string: String? = nil
    
  2. 使用非零值初始化:

    static var string: String = "some value"
    
  3. 如果您的目标是创建单身人士,请查看官方Apple guide了解解决方案:

    class MyViewController: UIViewController {
        static let staticSelf = MyViewController()
    }
    

答案 1 :(得分:3)

您需要在声明行中立即指定值:

    static var staticSelf = MyViewController()

这是,顺便说一下。在Swift中创建单例的标准模式。

答案 2 :(得分:3)

假设在objective-c中你会使用一个可能为null的指针,在Swift中,你会做类似的事情。

class MyViewController: UIViewController {
    static var staticSelf:MyViewController?
    override func viewDidLoad() {
        super.viewDidLoad()
        MyViewController.staticSelf = self
    }    

    func somefunc() {
    }
}

当您需要从其他地方访问时:

if let controller = MyViewController.staticSelf {
    controller.somefunc()
}