728x90
반응형
회사에서 RxMvvm 구조로 개발을 하는데,
그 때 ViewModel에서 Input 과 Output을 정의해서 View와 View Model의 의존 관계를 만들어 줍니다.
그 때 항상 의구심이 들었던 건데, Input과 Output을 struct 로 정의하는데, 어떻게 ViewModel과 View 간의 주소값이
변경이 안되고 서로 값을 바꾸고 사용하는 건지 가지게 되는지 이해 하기 어려웠습니다.
그래서 아무 생각 없이 따라 썼는데, 그게 더 답답하더라구요,,,,
https://www.youtube.com/watch?v=Z6BApjb04Jw
< J-Rock인데 노래가 좋아서 들고 왔습니다. >
** 결론 **
class ViewModel {
struct Input {
var askName : PublishSubject<String>
}
struct Output {
var resultName : PublishSubject<String>
}
func declareInput() -> Input {
return Input(askName: .init())
}
func declareOutput(input : Input) -> Output {
let output = Output(resultName: .init())
return output
}
}
class ViewController {
init(viewModel : ViewModel){
bind(viewModel)
}
private func bind(_ : ViewModel){
let input = viewModel.declareInput()
let output = viewModel.declareOutput(input : input)
}
}
대충 표현하면 이렇게 사용하는 것으로 배웠습니다.
그런데,,,, declareInput에서 나오는 값은 Struct이고 Struct는 Value Type이고 그럼 값만 받지,,,,
주소값은 안 받아질 것이고,,,,,, 근데,,, 어떻게 ViewController과 ViewModel이 서로 연결돼서 사용하는건지,,,,
정답은 바로 Observable에 있었습니다. PublishSubject , Observable 모두 Struct 구조가 아니라 Class 였습니다.
따라서 Struct로 만들어준 Input과 Ouput은 포장지이고 내부가 진짜였습니다.
// RXMvvm의 Input , Output 이 가능한 이유는 Struct 내부의 값이 모두 Class이기 때문에 가능한 것이다.
// 즉 감싸고 있는 것이 Struct 라도 내부가 주소값 이라면 원격으로 값 변동이 가능하다!
class F1 {
var name : String
init(name : String){
self.name = name
}
}
class ViewModel {
struct Input {
var f1 : F1
}
struct Output {
var resultName : String
}
func declareInput() -> Input {
return Input(f1: F1.init(name: "Hello"))
}
func declareOutput(input : Input) -> Output {
let output = Output(resultName: "world")
input.f1.name = "world hello"
return output
}
}
let vm = ViewModel()
var input = vm.declareInput()
input.f1.name // "Hello"
vm.declareOutput(input: input)
input.f1.name // "world hello"
728x90
반응형
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround)Enum의 활용 (0) | 2021.09.22 |
---|---|
PlayGround) Notification Center의 사용법 (0) | 2021.09.03 |
(Swift) Closure - Capturing Value (0) | 2021.09.03 |
PlayGround) 런타임 프로토콜 AND 컴파일 프로토콜 (클로저 잠깐,,) (1) | 2021.04.25 |
PlayGround) Generic - Closure의 확장 (1) | 2021.04.11 |
댓글