
문법적으로 Escaping Closure에 대해 봤을 때는 많이 와닿지 않았는데 네트워크 통신할 때 꼭 필수템이었던 것... 전에 프로젝트를 할 때에는 아무 생각없이 Escaping Closure를 사용했었는데 부트캠프 이후 한층 더 성장한 개발자가 되었나... 하튼 네이버의 언어감지 API와 파파고 API를 사용하여 번역 앱을 만들고 있었는데 print를 찍어봤을 때에는 올바르게 통신하여 잘 주고 받았다. 그런데 UI상에서는 자꾸 빈 문자열이 보여... 체크 포인트를 찍어서 확인해보니 UI를 그리는 함수가 API 통신 하는 함수보다 빨리 실행되고, 그 이후에 API 통신 하는 함수 내부 로직들을 실행하네.. NetworkManager 파일에서 서버 response값을 받아오는 작업이 끝났을 때 호출하려..

최종 프로젝트를 진행하다가 위 사진처럼 알림 탭에 예약내역과 사장님의 공지사항을 한 번에 보여줘야하는 상황이 생겼는데 2가지 다른 타입의 Model을 합쳐 하나의 ForEach문에 돌릴 때 어떤 Hashable을 사용해야할 지 몰라 에러가 났다. 구글링을 해보니... Swift에서 직접적으로 해시 테이블을 구현해서 사용할 일이 거의 없다고ㅎㅎ 그런데 사용할 필요가 없지만 커스텀하여 사용했다.ㅋㅋㅋㅋㅋㅋ 왜 사용했을까를 곰곰히 생각해보다가 Hashable이라는 것 자체를 잘 몰라서 그 땐 이게 최선이었던 것 같다. 우선 Hash라는 것부터 알아봐야겠다. 1. 해쉬란 데이터를 다루는 기법 중 하나 2. 데이터를 간단한 숫자로 표현 3. 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)..
원래 기획했던 Home 탭에 UI는 Open API 에서 제공하는 데이터 구조와 달랐고, 원하는 대로 디자인을 기획하려면 1개 가게에 대한 정보들을 for문을 돌려 임의로 반려동물 동반할 수 있는 가게들에 대한 디테일한 정보들을 알려주는 Json 데이터들을 가져오게 한 뒤 pets라는 배열에 담았다. 또 데이터가 없는 상황을 대비하여 nil이 아닐 경우에만 pets라는 배열에 담도록 분기처리를 해주었다. func fetchDetailPetStoreData(_ partCode: String) async { do { for num in 1 ... 250 { let pets = try await webService.fetchPetData(url: "https://www.pettravel.kr/api/detai..

나만의 그림 일기 앱을 만들다가 생겨난 버그인데 그림을 그리고, 내용을 작성하고 추가 버튼을 누르면 파이어베이스 Storage에는 그림 사진이, 그린 그림을 사진으로 변환하고, 변환한 사진을 Firebase Storage에 업로드. 작성한 내용과 사진에 대한 경로를 Firebase Firestore에 추가. 그 후 업로드가 되면 해당 FullScreen 모달 시트 창을 닫는다. 까지가 버튼에 대한 액션이고, 시트 창이 꺼지면 onDIsmiss에서 데이터를 다시 불러와 뷰를 새로 그려주게끔 코드를 구현했다. 그런데 새로 추가된 게시글의 사진만 불러오지 못하는 현상이 생겼다. 함수가 진행되는 모든 곳에 브레이크 포인트를 찍어 확인해보았는데 스토리지에 올라와있는데 못불러온다. 그 짧은 찰나에 아직 내부적으로 ..
Cannot assign to property: 'self' is immutable SwiftUI를 시작할 때 자주 보는 에러이다. 그런데 가끔 놓치는 부분인 것 같다. 바로 실행하는 동안 값을 바꿀 수 없다는 내용의 에러인데 아래와 같이 count를 세는 변수가 있으면 SwiftUI에서는 값을 바꿀 수 있는 @State 프로퍼티 래퍼를 써줘야한다. 꼭 명심할 것!!! // 에러 var count: Int = 0 // 에러 해결 @State private var count: Int = 0
swift는 역시 타입에 민감한 언어라는 것을 다시 한 번 깨달았다. 테스트해보고자 필요한 변수들을 나열하고 데이터가 뷰에 잘 뿌려지는 지 정도만 확인해보려고 하는데 아래 에러가 떠서 아예 프리뷰 캔버스가 로드가 되지 않는 상황이 왔다. The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions 컴파일러가 합리적인 시간 안에 타입 체크를 할 수 없다. 이런 내용의 에러였다... 10개가 채되지 않는 변수들에 대해 타입 추론을 똑똑하게 해낼 줄 알았는데 생각보다 많은 변수에 xcode도 힘들어했나보다. // 에러가 난 코드 @S..
예전에 UIkit을 공부하다가 DispatchQueue.main.asyncAfter를 알게되었는데 서버에서 가져온 데이터가 너무 빨리 로드가 되어서 약간의 딜레이와 함께 ProgressView()를 보여주고 싶어서 처음에 아래와 같이 코드를 구현했다. .onAppear { if index == musicStore.musics.count - 1 { Task { page += 1 isLoading = true try await Task.sleep(until: .now + .seconds(1), clock: .continuous) isLoading = false musicStore.musics += try await webService.fetchMusic2Data(page: page) } } } Dispatc..
// 에러가 난 코드 ForEach(musicStore.musics.enumerated(), id:\.offset) { (index, music) in LazyVStack(alignment: .leading){ Text("[\(music.앨범명)]") .bold() .padding(.bottom,5) Text("\(music.아티스트명) - \(music.저작물명)") } 저 에러 메세지를 그대로 번역해보자면 열거된 시퀀스 문자열이 임의 액세스 컬렉션을 준수해야 합니다. enumerated는 튜플로 반환되는 메소드이므로, random access collection을 준수하려면 Array로 만들어줘야한다. 그래서 Array(musicStore.musics.enumerated())로 형변환을 해주었더니 오..