Skip to content

Commit 6944073

Browse files
committed
modify
1 parent b444fe0 commit 6944073

File tree

6 files changed

+1734
-67
lines changed

6 files changed

+1734
-67
lines changed

_posts/2021/06/2021-06-26-ios-project-generate-with-tuist-5.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ title: "[iOS][Tuist 1.7.1] 프로젝트 생성/관리 도구 Tuist(5) - Local Sw
44
description: ""
55
category: "Mac/iOS"
66
tags: [Swift, Xcode, Tuist, Swift Package, SwiftPM]
7-
# published: false
87
---
98
{% include JB/setup %}
109

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
---
2+
layout: post
3+
title: "RIBs SwiftUI"
4+
tags: []
5+
published: false
6+
---
7+
{% include JB/setup %}
8+
9+
RIBs에서 View는 옵셔널입니다. 따라서 RIBs에서 View는 UIKit으로 구현하던, SwiftUI로 구현하던 상관없습니다.
10+
11+
그렇다면, 기존 프로젝트가 UIKit 기반이라면 SwiftUI는 부분적으로 적용할 수 밖에 없습니다.
12+
13+
만약, SwiftUI는 UIViewController의 View 역할만 담당하게 한다면 SwiftUI, UIKit, RIBs는 공존할 수 있지 않을까요?
14+
15+
SwiftUI의 View는 ObservableObject를 이용하여 구독하여 값을 전달받을 수 있고, 이벤트를 넘겨줄 수 있습니다.
16+
17+
이를 이용하여 View와 Interactor 간의 통신이 가능합니다.
18+
19+
즉, 다음과 같은 구조가 형성됩니다.
20+
21+
// 그림 1
22+
23+
그럼 코드를 작성해봅시다.
24+
25+
```swift
26+
//
27+
// SampleView.swift
28+
// SampleApp
29+
//
30+
// Created by minsOne on 2023/07/16.
31+
//
32+
33+
import Foundation
34+
import SwiftUI
35+
import Combine
36+
37+
struct SampleViewState {
38+
39+
}
40+
41+
enum SampleViewAction {
42+
case tap
43+
case world
44+
}
45+
46+
protocol SamplePresentableListener: AnyObject {
47+
var state: AnyPublisher<SampleViewState, Never> { get }
48+
func request(action: SampleViewAction)
49+
}
50+
51+
class SampleViewModel: ObservableObject {
52+
private weak var listener: SamplePresentableListener?
53+
var bag = Set<AnyCancellable>()
54+
55+
@Published var state: SampleViewState
56+
57+
init(listener: SamplePresentableListener?) {
58+
self.listener = listener
59+
self.state = .init()
60+
61+
listener?.state.sink { [weak self] value in
62+
self?.state = value
63+
}.store(in: &bag)
64+
}
65+
66+
func request(action: SampleViewAction) {
67+
print(action)
68+
listener?.request(action: action)
69+
}
70+
}
71+
72+
struct SampleView: View {
73+
@ObservedObject var viewModel: SampleViewModel
74+
75+
init(listener: SamplePresentableListener?) {
76+
self.viewModel = .init(listener: listener)
77+
}
78+
79+
var body: some View {
80+
HStack {
81+
Button("Hello") {
82+
viewModel.request(action: .tap)
83+
}
84+
Spacer()
85+
VStack(alignment: .center) {
86+
Spacer()
87+
Text("Hello").font(.title).border(.gray)
88+
Spacer().frame(height: 10)
89+
Text("World").font(.title).border(.gray)
90+
Spacer()
91+
}
92+
.border(Color.blue)
93+
Spacer()
94+
}.border(Color.red)
95+
}
96+
}
97+
98+
struct MyPreviewProvider_Previews: PreviewProvider {
99+
static var previews: some View {
100+
SampleView(listener: nil)
101+
}
102+
}
103+
104+
```

assets/mermaid-8.9.2/mermaid.min.js

Lines changed: 0 additions & 32 deletions
This file was deleted.

assets/mermaid-8.9.2/mermaid.min.js.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

custom/mermaid.min.js

Lines changed: 1630 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

custom/mermaid.min.js.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)