let coredata = UserCoreData(viewContext: appDelegate.persistentContainer.viewContext) let network = UserNetwork(manager: NetworkManager(session: UserSession())) let userRP = UserRepository(coreData: coredata, network: network) // Domain Layer let userUC = UserListUsecase(respository: userRP) let userVM = UserListViewModel(usecase: userUC) // Presentation Layer let userVC = UserListViewController(viewModel: userVM) 하나의 뷰 컨트롤러를 생성 시 ViewModel, UseCase, Repository, Network, CoreData 등 주입할 요소가 많아지는 것 을 느꼈습니다. 그렇다면 화면전환을 수행할 때마다 뷰 컨트롤러를 생성하게 되는데 매번 해당 컨트롤러에 의존성을 주입 해주어야 하나요? 또한 Network, CoreData 등 동일한 객체를 유지하기 위해서 이전화면의 ViewModel 객체를 다음화면의 ViewModel로 넘겨주면 될까요? 궁극적으로 실무에서 사용하는 방식을 알고 싶습니다.
코드파일의 5번 SerialSyncProject의 WriteSyncronously()를 실행할 경우 SerialSyncProject(9296,0x104550200) malloc: nano zone abandoned due to inability to reserve vm space. 현재 이름(write-safe): 재석 유 ================== WARNING: ThreadSanitizer: data race (pid=9296) Write of size 8 at 0x000108f5f7d0 by thread T8: #0 SerialSyncProject.Person.changeName(firstName: Swift.String, lastName: Swift.String) -> () <null> (SerialSyncProject.debug.dylib:arm64+0xdc98) #1 closure #1 () -> () in SerialSyncProject.WriteSyncPerson.changeName(firstName: Swift.String, lastName: Swift.String) -> () <null> (SerialSyncProject.debug.dylib:arm64+0x105b4) ....기타 경고들.... ================== 현재 이름(write-safe): 구라 김 현재 이름(write-safe): 나래 박 현재 이름(write-safe): 동엽 신 현재 이름(write-safe): 세형 양 마지막 이름은?(write-safe): 세형 양 이런식으로 경고메세지가 뜨는데 정상인걸까요? - 데이터 레이서 때문에 생기는 현상이어서 그냥 넘겨도 되는건지 궁금합니다!
다름이 아니고 UserListViewController에서 private func bindView() { tableView.rx.prefetchRows .bind { [weak self] indexpath in guard let rows = self?.tableView.numberOfRows(inSection: 0), let itemIndex = indexpath.first?.item else { return } if itemIndex >= rows - 1 { self?.fetchMore.accept(()) } } .disposed(by: disposeBag) } 해당 코드 작성한 것을 확인했는데 이 상황에서 itemIndex >= rows - 1 가 정상적으로 동작하지 않는다고 생각이 들어서요. 정상적으로 동작하는 경우도 있지만 (천천히 스크롤 할 때) 빠르게 스크롤했을때 rows 는 30이라고 할때 itemIndex 는 24가 찍혀 self?.fetchMore.accept(()) 가 실행이 안되더라구요 그렇다면 prefetchRows 를 쓰는게 좋은 방법인가에 대한 생각이 들어서 질문 드립니다!
안녕하세요 엘런님 먼저 정말 좋은 강의 제작 해주셔서 감사합니다. 현재 컨커런시 part1을 시작하려고 강의 구매 및 강의 자료를 다운받았는데요 part2 역시 강의가 오픈되면 구매할 생각입니다. 그런데 그 때는 part2 강의자료만 따로 제공되지는 않을까요?? 설명을 보니 묶어서 교제로 판매하신다고 하시는데 part2 강의 자료만 필요한데 교제까지 구매하면 조금 부담이 될 것 같아사요
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 주사위만들기 앱에서 viewDidLoad()를 다음과같이 정의하고 RESET 버튼을 눌렀을 때 viewDidLoad()를 호출해도 되나요? 작동은 하는데 비효율적이고 문제가 되는 부분이 있을 것 같은데 궁금합니다. override func viewDidLoad () { super . viewDidLoad () mainLabel . text = "선택하세요" // 1) 첫번째, 두번째 이미지 뷰에 준비 이미지를 띄워야 함 comImageView . image = imageLiteral(resourceName: "ready") myImageView . image = UIImage ( named : "ready.png" ) // 2) 첫번째, 두번째 레이블에 "준비" 라는 문자열을 띄워야 함 comLabel . text = "준비" myLabel . text = "준비" }
질문 강의 중 스냅킷을 사용하여 이미지 뷰의 제약을 설정하셨는데 make.leading.top.bottom.equalToSuperview().inset(20) make.width.height.equalTo(80). top과 bottom을 상위 뷰에 걸어 상대적 높이를 설정했으나, 절대적 높이 height도 별도로 걸어주신 이유가 있을까요?
안녕하세요 강사님 좋은 강의 잘 수강하고 있습니다! 강의에서 @Observable 사용시 큰 설명 없이 넘어가셔서 개인적으로 알아보는 중입니다 [SwiftUI] Observable macro를 통해 모델 데이터를 만들고 관리하는 방법 (tistory.com) [SwiftUI] iOS17 이후의 상태 관리 (velog.io) [SwiftUI] @Observable 매크로 (1) (tistory.com) Discover Observation in SwiftUI (feat. WWDC 2023) :: iOYES (tistory.com) 등 위의 링크들을 살펴보았지만 초보자인 제가 이해하기엔 어려운 내용들이었습니다 그래서 강사님 강의 중 SwiftUI의 Property Wrapper(@State, @Binding...) 를 구입해봤지만 아쉽게도 @Observable이 아닌 구 버전의 프로퍼티 래퍼인 @ObservableObject를 설명해주시더라구요(이 부분은 아쉬웠지만 나머지 래퍼들을 공부하는 데에는 정말 좋은 강의라고 생각합니다!) 일단 강의의 흐름을 보면 @State와 묶어서 설명하시길래 @State는 변수의 변화를 감지하기 위한 래퍼이고 @Observable은 class나 구조체 내 멤버 프로퍼티 값들이 변경되는 걸 감지하기 위한 래퍼라고 이해했는데 맞게 이해한 걸까요..? 답변 주시면 감사하겠습니다!! 좋은 하루 보내세요!
안녕하세요 좋은 강의 잘 듣고 있습니다. 다름이 아니라 혹시 애플 공식 문서보는 강사님만의 꿀팁 같은게 있을까요? 공식문서를 찾아볼 수 있긴 한데 찾고자 하는걸 정확하게 검색해야 결과를 얻을 수 있고 뭔가 보기가 어렵게 되어 있는 것 같아서요... 그리고 제가 원하는 기능을 구현하려면 물론 구글링도 있지만 공식문서를 최대한 참고해서 구현 방법을 익히고 싶은데 이런 것들은 공식 문서에서 어떻게 검색해야 하나요? 예를 들어 SwiftUI에서 반복문으로 이루어진 텍스트들을 한번에 지우는 기능을 구현하고 싶은데 이에 연관된 것들을 공식 문서에서 쉽게 찾는 방법 등을 알고 싶습니다. 감사합니다.
안녕하세요 @Observable 이 부분에서 에러가 발생해서 질문드립니다 현재 맥북 버전은 Sequoia 15.0이며 Xcode 버전은 16.0을 사용 중입니다 Observable()' is only available in iOS 17.0 or newer라는 에러가 발생한 상황입니다 구글링을 해도 해결방법을 찾지 못해서 질문드립니다..! 그리고 추가적으로 Xcode 16으로 업뎃 후 프리뷰 화면 보여주는 단축키인 cmd+option+enter를 아무리 눌러도 프리뷰가 xcode에서 보이지 않는 상황입니다.. 마지막으로 제가 질문드렸던 다른 게시글인데 확인 한 번 부탁드리겠습니다 VStack, HStack으로 뷰 구성하기 강의 padding 질... - 인프런 | 커뮤니티 질문&답변 (inflearn.com) 답변 주시면 감사하겠습니다!
안녕하세요! 좋은 강의 잘 수강하고 있습니다. [계산기 #6 - 경고! 값을 입력하세요!] 강의에서 19분 4초 에 함수 호출 방법 설명이 나와있는데 함수 정의에 parameter라고 하고, 함수 호출시에는 argument라고 하는 걸로 알고 있습니다. 잘못 표기된 걸까요..? 아규먼트 레이블 같은 개념과도 혼동될수 있을 것 같아서요
안녕하세요. 강의 중에 설명해주시는 내용 중 Development info > Main interface 설정하는 부분이 안보여서 질문드립니다. 최신 xcode, mac 버전을 사용하고 있어 업데이트가 된 거 같은데 어디에서 설정할 수 있을까요? 강의 중 화면 제 화면 .
import UIKit class TestClass {} class SomeClass { var a = 10 var b = TestClass() func myFunc() { print(self.a) } lazy var myClosure1: (()->Void)? = { () -> Void in print(self.a) } lazy var myClosure2 = { [a] () -> Void in print(a) } lazy var myClosure3 = { [b] in print(b) } deinit { print("SomeClass deinit") } } var myClass1: SomeClass? = SomeClass() var myClass2 = myClass1 var myClass3 = myClass1 var myClass4 = myClass1 myClass1?.myClosure1 myClass1?.myClosure1 = nil myClass1?.myClosure2 myClass1?.myClosure3 myClass1 = nil myClass2 = nil myClass3 = nil myClass4 = nil 위 코드에서 myClusore3 의 캡쳐 리스트엔 b를 작성했고, b는 클래스의 인스턴스로 참조타입으로 알고 있습니다. 이 때 위 코드를 실행하면 deinit이 실행되는데요. weak 키워드를 사용하지 않았는데도 deinit이 실행되는 이유가 있을까요?
안녕하세요 강의 수강 중 이해가 안되는 부분이 있어서 질문 드립니다 import SwiftUI struct ContentView: View { var body: some View { VStack{ HStack{ Image("dogProfile") .resizable() .frame(width: 120, height: 120) .clipShape(Circle()) .overlay( Circle() .stroke(Color.teal, lineWidth: 3) ) VStack(alignment: .leading){ Text("이름: 키도") Text("시바견") Text("2017년 5월생") } // VStack 안에 있는 뷰에 모디파어어를 일괄 적용하고 싶을 경우 이런 식으로 구성할 수 있다(일괄 적용이라는 표현보단 Vstack 자체에 모디파이어를 적용했다는 표현이 더 옳을지도? .font(.system(size: 20)) // 정보 글의 폰트 사이즈 .padding(.leading, 20) // 그림과 정보 글 사이의 공백 } .padding(.bottom, 20) VStack(alignment: .leading, spacing: 10){ Text("좋아하는 것") .font(.system(size: 20)) .bold() Divider() // 좋아하는 것 밑에 있는 선을 그려주는 함수 Text("- 각종 고기(🐮 = 🐷 = 🐔 > 🐟)") Text("- 장본 게 담겨 있는 종량제 봉투") Text("- 집에 새로 온 사람") } .padding() .background( RoundedRectangle(cornerRadius: 15) .fill(.mint) .opacity(0.2) // 색의 투명도를 지정하는 모디파이어 0이면 완전 투명 .shadow(radius: 5) ) VStack(alignment: .leading, spacing: 10){ Text("스킬") .font(.system(size: 20)) .bold() Divider() // 좋아하는 것 밑에 있는 선을 그려주는 함수 HStack(alignment: .top, spacing: 30){ VStack(alignment: .leading, spacing: 10){ Text("- 앉아") Text("- 엎드려(앉아와 자주 혼동함)") Text("- 하우스(집으로 들어가기)") } VStack(alignment: .leading, spacing: 10){ Text("- 손") Text("- 코") } } } .padding() .background( RoundedRectangle(cornerRadius: 15) .fill(.pink) .opacity(0.2) // 색의 투명도를 지정하는 모디파이어 0이면 완전 투명 .shadow(radius: 5) ) } .padding() // 질문인 부분 } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } } 위 코드 맨 마지막 padding을 보면 가장 처음 사용하는 VStack에 .padding을 적용하는 코드입니다 궁금한 건 저 padding의 값을 50, 100 이렇게 설정해도 Vstack의 위 아래 여백은 변하지 않는다는 점입니다. 분명 .padding에 값을 넣어주지 않으면 기본적으로 상하좌우 모든 부분에 여백을 주는 걸로 알고 있는데 만 상하 부분의 여백이 변하지 않는 것을 확인했습니다. 개인적으로 여백을 넓게 잡으면 여백을 잡기 위해 글자나 사진 사이즈 등이 뭉개지는 현상이 발생할 줄 알았는데 좌우는 뭉개지는 데 상하는 뭉개지지 않더라구요 Vstack이 기본적으로 가지고 있는 공간이 있는 최소한의 건지... 혹시 뭉개지지 않는 이유를 알 수 있을까요?? 그리고 혹시 // VStack 안에 있는 뷰에 모디파어어를 일괄 적용하고 싶을 경우 이런 식으로 구성할 수 있다(일괄 적용이라는 표현보단 Vstack 자체에 모디파이어를 적용했다는 표현이 더 옳을지도? 이 주석 제가 맞게 이해한 건지도 알려주시면 정말 감사하겠습니다..! 좋은 하루 보내세요! 감사합니다!