2016-04-15 5 views
1

В быстром, есть ли в любом случае я могу создать общий класс? То есть, скажем, есть класс называется Value:Создание общего класса в swift

class Value{ 
    var a = 0 
} 

Я хочу использовать этот класс для совместного использования различных экземпляров объекта. Например,

class Main{ 
    func main(){ 
    print(Value.a) 
    Value.a++ 
    } 
} 

class OtherClass{ 
    func otherMain(){ 
    print(Value.a) 
    Value.a++ 
    } 
} 


let main = Main() 
let other = OtherClass() 
//I want this call to print 0 
main.main() 
//I want this call to print 1 
other.otherMain() 

Я попробовал статический на вар а, но тогда это не будет позволять мне делать арифметику, такие как дополнение ... Но это работает, если изменить значение на статические вместо класса. Я думал, что только различие между структурой и классом было либо переменным, либо ссылочным типом ...

Буду признателен за любую помощь. Спасибо

+0

Почему бы вам просто не создать глобальную переменную 'var a: Int = 0'? – Sulthan

+0

Я работаю над большим проектом, который содержит много быстрых файлов. Поэтому я хочу иметь один отдельный класс для обработки одного типа переменных и хочу, чтобы класс использовался как таблица, чтобы делиться своими данными с другими экземплярами. – hikki

+0

Вы можете использовать шаблон Singleton. – Khuong

ответ

0

Лучший способ сделать то, что вы хотите сделать, к сожалению, вовсе не делать. Кажется, что архитектура, которую вы проектируете, довольно хрупка, и два независимых класса не должны зависеть от состояния общего объекта, и если это так, они должны быть связаны через наследование классов или протоколы.

Лучшим решением было бы:

class MyClass { 
    static var a = 0 
} 

class SubclassA: MyClass { 
    func someFunc() { 
     print(self.dynamicType.a) 
     self.dynamicType.a += 1 
    } 
} 

class SubclassB: MyClass { 
    func otherFunc() { 
     print(self.dynamicType.a) 
    } 
} 

Там несколько причин, вы должны сделать это таким образом, в течение предыдущего решения:

  1. Ваш общего состояния может оставаться частным для этих двух классов , Никто из этих классов не может или не должен изменять это значение.

  2. Модели Singleton в то время как иногда полезны, имеют кучу проблем. This article объясняет это лучше, чем я могу.

Вы должны думать о своем приложении и своей архитектуре кода как о конечной машине, перемещаясь из одного состояния в другое. Цель состоит в том, чтобы написать код, который многократно используется, модульный, общий и имеет как можно меньше состояний. Чем больше без апатии ваш код, тем лучше. Вот и вся идея таких платформ, как ReactJS и ReactiveCocoa; они помогают упростить это состояние приложения.

Возможно, вы ищете постоянство данных, например, Realm или CoreData, где вы сохраняете данные на диск, а затем можете прочитать их позже при необходимости. Представьте себе, например, что вместо Int ваше общее состояние было массивом UIImages. С шаблоном singleton вы постоянно держите эти изображения в памяти. Что, если список будет составлять 200 или 300 в длину? Тогда у вас проблемы с памятью.

+0

Хорошо, я вижу суть. Но мои два класса не являются независимыми, поэтому я предполагаю, что наследование было тем, что мне было нужно. В вашем коде subClassA/B наследует MyClass? Так это должно быть SubClassA/B: MyClass? откуда появился динамический тип? – hikki

+0

Извините, я исправил свою опечатку. dynamicType относится к экземплярам класса, поскольку 'a' является статическим var, а не переменной экземпляра. Если классы не связаны, но они имеют одни и те же данные, то, возможно, переосмыслите свой дизайн данных. – barndog

+0

Я не согласен с тем, что это будет улучшением.Переменные не должны напрямую увеличиваться, как это, из другого класса. Мне было бы гораздо лучше сделать счетчик частным и объявить функцию, которая будет делать приращение. Это сделает код более читаемым. – Sulthan