2016-05-19 7 views
1

У меня есть два класса: ClassA и ClassB.Управление классом в swift

ClassA одноэлементно, который выглядит следующим образом:

class ClassA { 
    class var sharedInstance: ClassA { 
     struct Singleton { 
      static let instance = ClassA() 
     } 
     return Singleton.instance 
    } 

    private (set) var classB = ClassB()  

    init() {  
    }  
} 

ClassA можно только инициализировать ClassB, который работает отлично. Моя ClassB выглядит следующим образом:

class ClassB { 

    init() { 

    } 
} 

Теперь я хочу ClassB быть доступны только по ClassA, а не каким-либо другим классам в проекте. Например, ClassC не должен быть в состоянии инициализировать ClassB так:

class ClassC { 
    private var classB = ClassB() 
} 

Как исполнять это поведение?

+2

Возможно, вам не нужно определять 'struct' для создания« Singleton Class ». Посмотрите на это 'class ClassA {static let sharedInstance = ClassA()}' –

+1

Вы также должны сделать одиночный инициализатор singleton приватным – Hamish

ответ

2

Вы могли бы сделать класс B частный класс в А, как это:

class ClassA { 
    private var classB = ClassB() 
    private class ClassB{ 
     init() { 
     } 
    } 

    class var sharedInstance: ClassA { 
     struct Singleton { 
      static let instance = ClassA() 
     } 
     return Singleton.instance 
    }  

    init() {    
    }   
} 

UPDATE

Если у вас есть много таких классов, можно создавать расширения для каждой необходимой зависимости:

extension ClassA { 
    private class ClassC { 
     init() { 
     } 
    } 
} 
+0

, но позволяет сказать, что у меня есть много классов, которые предоставляют разные fucntionality, тогда мой ClassA станет беспорядком, в конечном итоге содержащим много кода – hariszaman

+0

@hariszaman Вы можете использовать расширения, см. мое обновление – Daniel

+0

это не работает – hariszaman

0

Создать требуемый init в ClassB. Хранить и аргументировать как AnyObject, который является вызывающим. т. е. при распределении ClassB передать себя вызывающему из класса, который вы назначаете.

Внутри требуется init, проверьте, является ли вызывающий объектKindOfClass ClassA. Если это класс, вызов init() или super.init() в противном случае возвращает nil.

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