Ios Swift:如何声明一个静态成员变量,它是一个类

Ios Swift:如何声明一个静态成员变量,它是一个类,ios,swift,Ios,Swift,我试图声明一个类,它有一个静态变量,我想将它设置为类的一个对象,即 class MyViewController: UIViewController { @IBOutlet weak var title: UILabel! static var staticSelf:MyViewController 此声明生成以下错误: "class var declaration requires an initializer expression or getter/setter

我试图声明一个类,它有一个静态变量,我想将它设置为类的一个对象,即

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
,但这会导致内循环,因此我将其更改为
MyViewController.staticSelf=selfInstance
,但这也创造了一个内循环


我已经尝试了一千种方法来进行设置,本来可以用objective-C在3秒钟内完成,现在我对Swift非常厌倦。

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

    static var staticSelf = MyViewController()
顺便说一句,这是在Swift中创建单例的标准模式。

基本示例

class MyClass {
    static var string: String
}
不起作用,因为单位化变量具有
nil
值。但是,在Swift中,您只能将
nil
分配给可选变量

您有两个选择:

  • 将变量声明为可选

    static var string: String?
    

  • 使用非nil值初始化:

    static var string: String = "some value"
    
  • 如果您的目标是创建一个单例,请参阅官方的解决方案:

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

    假设在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()
    }
    

    您正在将
    nil
    分配给一个非选项,这是正确的。你本可以做到的;静态变量staticSelf:侦听器?=nil@Woofbeans:别受够斯威夫特!一旦你掌握了窍门,它实际上很棒:)单身汉不应该有私人的初始值设定者吗?
    if let controller = MyViewController.staticSelf {
        controller.somefunc()
    }