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?
或
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()
}