2015-11-25 2 views
-1

Может ли кто-нибудь объяснить мне разницу между статическими переменными в swift vs static variables в java?Разница между статикой в ​​swift и static в java

Я знаю, что статические функции в java выполняются во время выделения памяти, а не когда экземпляр создается для объекта.

Я пытался сделать singleton в swift, я увидел, что вызов функции getInstance() в моей функции ViewController viewDidLoad выполнялся до того, как мои статические переменные заселялись, и поэтому возвращаю значения 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

Для меня это звучит так, будто вы не декларируете свой синглтон правильно, больше кода поможет. Но для быстрого решения, а только из предположения - вот быстрый простой способ объявить одиночки с Swift 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()).

Самый простой способ сделать синглтона с Swift в эти дни, как это:

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

И A.sharedInstance будет одноэлементный экземпляр.

Если вы не хотите, чтобы другие делали A() вручную за пределами этого файла, добавьте строку private init() {}.

Если вы все еще предпочитаете путь X.getInstance(), добавьте линию public static func getInstance() { return sharedInstance }.

+0

Я все еще вижу значение nil для xInstance, когда я запускаю getInstance или даже делаю X.xInstance. Строка public static let sharedInstance = A() выполняется после вызова getInstance. Не могли бы вы рассказать мне, почему? –

Смежные вопросы