여러 개의 인스턴스 생성 방법과 vc 사이에서의 값 전달 없이 각 vc에서 바로 특정 인스턴스에 접근하여 값을 줄 수 있는 방법을 알고 싶습니다

본 내용에선 ViewController를 VC로 줄여서 사용했습니다.

struct A {
  var a : String = ""
  var bList : [B] = []
}

struct B {
   var b : String = ""
   var cList : [C] = []
}

struct C {
   // d 변수는 1번 VC에서 값이 입력됨
   var d : String = ""
   // e 변수는 2번 VC에서 값이 입력됨
   var e : String = ""
}

var firstInstance = A() //--> 오로지 한개.
var secondInstance = B() //--> 한 개
var thirdInstance = C() //--> 여러개

:point_up:데이터 모델링 구조


NavigationController → 메인 VC → 1번 VC → 2번 VC → 3번 VC → 다시 메인 VC으로 돌아감.

:point_up:네비게이션 구조


현재 위 코드와 같은 구조의 데이터 모델과 네비게이션 구조가 있습니다.

현재 thirdInstance들의 property 들이 모두 다른 ViewController에서 값이 주어질때 어떻게 인스턴스를 생성하고 어떻게 다른 VC으로 전달을 시켜야할지에 대해서 고민을 하고 있습니다.

제가 시도해보았던 방법입니다.

  1. firstInstance를 전역변수로 선언한다. → (싱글톤 개념은 아직 미숙해서 못쓰고 있음…ㅜ)

  2. 1번 VC에서 아래 코드와 같이 instance를 생성하는 함수를 만든 후 for문을 통해서 a의 갯수만큼 instance를 생성하도록 했습니다. (*instanceArr는 구조체 C 인스턴스 들을 담은 후에 2번 VC로 넘기기 위해 생성, *aArr는 a의 갯수만큼 insatance를 생성시키기 위해서 만듬)

     func makeInstance(a:String) {
        var instance = C()
        instance.a = a
        self.instanceArr.append(instance)
     }
    
     for a in aArr {
         makeInstance(a: a)
     }
    

3.이렇게 만들어낸 instanceArr(=C 구조체의 인스턴스를 담은 배열)를 2번 VC으로 넘김
4. 2번 VC에서 d 프로퍼티에 값을 입력. 이때, SegmentedControl의 selectedIndex에 따라 instanceArr에 접근하여 0번 인덱스에선 instanceArr의 0번 인스턴스에 접근하여 d 프로퍼티에 값을 입력하고, 1번 인덱스에선 instanceArr의 1번 인스턴스에 접근하여 d 프로퍼티에 값을 입력하는 식으로 전개를 함.
5. 그리고 2번 VC에서 secondInstance.cList = instanceArr와 같이 할당을 시킴.
6. 3번 VC에서는 secondInstance를 바탕으로 테이블 뷰에 뿌려줌. 또 firstinstance.bList에다가 append 시킴
7. main VC에서 firstInstance에 접근하여 테이블 뷰에 데이터를 뿌려줌.

기존에는 C 구조체에 프로퍼티가 d, e 모두 있는 것이 아니라, B 구조체에 d(=배열)와 cList 프로퍼티가 있고, C 구조체에는 e 프로퍼티만 있었습니다. 그래서 C 구조체의 d 프로퍼티를 B 구조체에서 배열로서 나열시켜 B 구조체의 d 배열 프로퍼티를 1번 VC에서 채워주고, C 구조체에서는 e 프로퍼티만 입력을 시켜준 뒤에 B 구조체의 cList에 append 시켜주는 구조였습니다.

그러던 중 C 구조체 하나로 합칠 수 있을 것 같다는 의견을 듣고 한 번 대대적인 수정에 들어가 보았지만, 현재 인스턴스가 print 조차도 되지 않고 있는 상황입니다… ① 제가 인스턴스를 여러개 생성하는 법을 "잘못"한 것이라면, 어떻게 생성을 해야하는 것인지② 1번 VC에서 2번 VC로 이동하는 것과 같은 VC 간의 이동 부분에서 꼭 firstInstance에 배열을 추가하기 위해서 3번 VC까지 가지않고도 각 VC에서 바로 추가할 수 있는 방법이 없는 것인지도 궁금합니다.

좋아요 1

뷰/뷰 컨트롤러는 화면 전환에 따라서 라이프사이클이 있습니다. 새로 생성되기도 하고 사라지기도 하지요.

이에 비해서 앱에서 사용하는 데이터는 화면 전환과 관계 없이 존재하고, 화면 전환과 관계없이 데이터는 변화하기도 합니다.

이제 화면에 보이는 부분(뷰/뷰 컨트롤러)과 모델의 분리가 필요합니다. MVC, MVP, MVVM 과 같은 다양한 아키텍쳐들이 있는데 공통적인 것이 바로 모델이 분리되어 있다는 것이죠.

모델을 만드는 가장 간단한 방법이 싱글톤 패턴을 이용하는 거에요. 싱글톤 패턴을 이용하면 앱에서 유일하게 존재하는 1개의 모델 객체를 이용해서 화면 전환과 관계없이 데이터에 접근할 수 있습니다.

교재에 잇는 AirCnC 예제에서 예약을 위한 모델을 참고해보세요.

질문에 대한 직접적인 답은 아니지만, 충분히 고민이 될 때 참고해보면 도움이 될 겁니다.

좋아요 2

답변 감사합니다. 이제 싱글톤 패턴이 필요한 시점이 온 것 같습니다!

좋아요 1