我试图声明一个具有静态变量的类,我希望将其设置为该类的对象,即
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非常厌倦。
答案 0 :(得分:9)
基本示例
class MyClass {
static var string: String
}
不起作用,因为单元化变量的值为nil
。但是,在Swift中,您只能将nil
分配给可选变量。
您有两种选择:
将变量声明为可选
static var string: String?
或
static var string: String? = nil
使用非零值初始化:
static var string: String = "some value"
如果您的目标是创建单身人士,请查看官方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()
}