2015-11-25 107 views
-1

任何人都可以解释一下swift中的静态变量与java中的静态变量之间的区别吗?java中的静态变量与静态变量之间的区别

我知道Java中的静态函数在分配内存时执行,而不是在为对象创建实例时执行。我试图在swift中创建一个singleton,我看到我的ViewController viewDidLoad函数中调用getInstance()的函数在我的静态变量被填充之前执行,因此我返回nil值。

我该如何解决这个问题?我应该找到一个“初始化器”类的函数,其中所有类的分配和初始化发生,所以这个工作顺利吗?

请告知

我加入一个代码片段相同

class X { 
    var xInstance:X = X() 
    public static func getInstance() { return xInstance } 
} 

class Y { 
    var xInstance: X? 
    var yInstance: Y = Y() 
    public override init() { 
    xInstance = X.getInstance() 

    public static func getInstance() { 
     return yInstance 
    } 
} 


class someView: UIView { 

    public override init() { 
    var xInstance = X.getInstance() //This is my problem area. I am seeing nil for xInstance 
    } 

} 

我看到零值xInstance。我究竟做错了什么?

+2

你能展示一些代码吗?据我所知,没有太大区别。 – Peyman

回答

1

对我来说,这听起来像你没有正确地声明你的单身人士,更多的代码会有所帮助。但对于一个快速的解决,和刚出来的假设 - 这里是申报单与雨燕1.2

static let sharedInstance = Object() 
@objc private override init() {} //This prevents others from using the default '()' initializer for this class 

,然后用单将

Object.sharedInstance.fuctionName() 
0

在原来的一个快速简便的方法代码片段,xInstance是在创建X实例时需要初始化的实例属性。

静态方法getInstance()无法访问实例属性或方法。 (嘿!你错过了getInstance()方法的返回类型)。

做一个单身斯威夫特与这些天最简单的方法是这样的:

public class A { 
    public static let sharedInstance = A() 
} 

而且A.sharedInstance将成为单一实例。

如果您不希望别人在此文件的外部手动执行A(),请添加一条private init() {}行。

如果您仍然偏好X.getInstance()的方式,请添加一条public static func getInstance() { return sharedInstance }行。

+0

当我触发getInstance或甚至执行X.xInstance时,我仍然看到nInstance的值为xInstance。行public static let sharedInstance = A()在getInstance被调用后执行。你能告诉我为什么? –