Boost SwiftUI 스터디
최근 SwiftUI 스터디를 시작했습니다.
이름은 Boost SwiftUI 스터디! (사실 공식 이름 없음 ㅎ;)
iOS 개발자 7명과 디자이너 1명이 함께하는 스터디입니다. (혹시 깃허브 레파지토리가 궁금하다면...? https://github.com/BoostSwiftUI/SwiftUI)
SwiftUI Tutorial로 기초를 잡고, 디자이너와 피그마로 협업하여 다양한 UI 개발 경험을 쌓습니다.
마지막으로 주 1회 WWDC 시청으로 딥 다이브를 하고 있습니다.
스터디를 시작한지 약 한 달이 지난 지금, SwiftUI와 관련된 생각이 조금씩 쌓여서 글까지 쓰게 되었습니다.
참고로 저는 최소 지원 버전을 iOS 15로 설정하여 진행했습니다.
깊은 고민 없이도 만들기 쉽다.
처음 이 생각이 든건 SwiftUI Tutorial(https://developer.apple.com/tutorials/swiftui)이 끝났을 때입니다.
따라친걸 고려하더라도 적은 시간동안 적은 코드를 작성했는데 그럴듯한 결과가 나왔습니다.
이후 직접 앱을 구현할 때도 크게 고민을 하지 않아도 간단한 결과물은 손쉽게 구현할 수 있었습니다.
이 과정을 통해 SwiftUI가 추구하는 길이 무엇인지 대략 느낄 수 있었습니다.
SwiftUI 프레임워크가 개발자의 일을 덜어주는 방향으로 발전한다는 것을 느꼈고, 이 느낌은 SwiftUI 소개 WWDC에서 더 확고해졌습니다.
하지만 이게 무조건적으로 좋은건 아니었습니다.
예상대로 동작하지 않는 경우도 있다. (이유도 찾기 어렵다.)
코드를 작성할 때 어쩔 수 없이(?) 생각을 하게 됩니다.
이렇게 동작하겠지 생각을 하고 작성하면 예상대로 동작하지 않는 경우도 있습니다.
최근에는 Source of Truth로 인한 body 업데이트에서 느끼고 있습니다.
지금 당황스러움을 느끼고 있는걸 하나 공유 드리면,
final class DummyClass {
let name: String
init(name: String) {
self.name = name
print("DummyClass init")
}
deinit {
print("DummyClass deinit")
}
}
struct ContentView: View {
@State var count = 0
init() {
print("Content Init")
}
var body: some View {
let _ = print("ContentView Body")
AView(name: "정주\(count)")
Button(
action: {
count += 1
}, label: {
Text("Content Button: \(count)")
}
)
}
}
struct AView: View {
private let dummyClass: DummyClass
init(name: String) {
dummyClass = DummyClass(name: name)
print("A Init: \(dummyClass.name)")
}
var body: some View {
Text("AView")
}
}
위 코드는 ContentView의 Button을 누를 때마다 AView의 body가 호출됩니다.
(일단 이 결과도 잘 이해는 안 가요. dummyClass는 @State같은 SOT가 아닌데 왜 매번 body가 갱신될까요? Hmmm,,,)
struct AView: View {
let didTapHealthScoreButton: PassthroughSubject<Void, Never>
init(didTapHealthScoreButton: PassthroughSubject<Void, Never>) {
self.didTapHealthScoreButton = didTapHealthScoreButton
}
var body: some View {
Text("AView")
}
}
하지만 AView의 DummyClass를 PassthroughSubject<Void, Never>로 바꾸면, Body가 ContentView가 init 될 때 한 번만 호출됩니다.
(이게 정상 아닌가?)
단순히 제가 만든 클래스에서 프레임워크의 클래스로 변경했을 뿐인데 body 업데이트 여부가 달라졌습니다.
SwiftUI에서 이 차이는 크다고 느껴지는데 명확한 이유를 알 순 없더라고요.
이런 케이스가 쌓이고 쌓여 큰 사이드 이펙트로 돌아온다고 생각하니 약간의 거부감이 들었습니다.
그래도 SwiftUI가 좋다.
결국에는 UIKit에서 SwiftUI로 전환될 것입니다.
완전히 전환되려면 최소 4~5년은 걸릴 거 같아요... 아직 Objective-C도 쓰는데... ㅎ;
꾸준히 연습하면서 큰 파도에 탈 준비를 해야겠다고 느껴졌어요.
그래서 최근 SwiftUI 스터디도 하고 있고 열심히 준비하고 있습니다.
차근차근 SwiftUI와 관련된 기술 포스팅도 작성해보겠습니다 ㅎ
감사합니다.