최신글

more

[Swift] difference(from:)와 applying(_:)

difference(from:) difference(from:)은 두 개의 Collection 차이를 쉽게 구할 수 있는 메서드입니다. A와 B를 비교했을 때 무엇이 추가로 있고, 무엇이 없는지 알 수 있습니다. (A collection of insertions and removals that describe the difference between two ordered collection states.) 사용법도 간단합니다. let arr1 = [1, 2, 3, 4] let arr2 = [1, 3, 4, 5] let diff = arr2.difference(from: arr1) diff를 출력해 보면 arr1이 arr2가 되기 위해 무엇을 추가하고, 무엇을 빼야 하는지 알 수 있습니다. "Collect..

개념 & 응용 2024.04.20 0

[Xcode] Placeholder가 있는 Code Snippet 작성 방법

Code Snippet Code Snippet은 미리 정한 짧은 키워드로 긴 코드를 자동 완성해주는 기능입니다. 아무리 긴 코드라도 미리 등록한 단축어를 입력하면 끝이니 생산성에 큰 도움을 줍니다. (전 Attributes, Constraints처럼 오타가 많이 나는 단어도 애용합니다 ㅎㅎ;) Code Snippet은 많이들 아시지만, placeholder가 포함된 code snippet은 잘 모르기도 합니다. Placeholder가 있다면 무엇을 넣어야 할지 파악하기 쉽고, Tab을 이용하여 입력 부분으로 바로 이동할 수도 있습니다. (중요) Placeholder를 포함한 Code Snippet 생성 Placeholder는 를 작성하면 됩니다. Code Snippet이 아니더라도 코드 입력창에서 을 작..

Xcode 2024.04.03 0

[을지로 맛집] 온점 리뷰 / 장터국밥 맛집 / 육회 비빔밥 맛집 / 숯불구이 맛집

기본 정보 가게 이름 온점 을지로점 메뉴 & 가격 장터국밥 12,000원 육회 비빔밥 13,000원 온점 시그니처 갈비 (250g) 38,000원 밑반찬 온점의 밑반찬입니다. 깍두기, 배추김치, 시금치나물, 오징어젓갈(추정)이 나와요. 밑반찬의 간이 세지 않고 메인 요리랑 함께 먹기 딱 좋더라고요. 특히 시금치는 갈 때마다 리필까지 하면서 맛있게 먹고 있어요. 장터국밥 첫 번째 메뉴는 장터국밥입니다. 정말 괜찮은 점심 메뉴예요. 온점이 좋은 품질의 소고기 숯불구이를 팔고 있는데요. 정육하고 남은 고기로 여러 국을 끓이는 거 같더라고요. 이 장터국밥에도 고기가 정말 푸짐하게 들어갑니다. 건더기로는 소고기, 우거지, 무, 파가 들어가고, 딱 깔끔하게 매콤한 정도로만 고춧가루가 들어갑니다. 장터국밥하면 자극적..

맛집 2024.03.27 1

Swift

more

[Swift] difference(from:)와 applying(_:)

difference(from:) difference(from:)은 두 개의 Collection 차이를 쉽게 구할 수 있는 메서드입니다. A와 B를 비교했을 때 무엇이 추가로 있고, 무엇이 없는지 알 수 있습니다. (A collection of insertions and removals that describe the difference between two ordered collection states.) 사용법도 간단합니다. let arr1 = [1, 2, 3, 4] let arr2 = [1, 3, 4, 5] let diff = arr2.difference(from: arr1) diff를 출력해 보면 arr1이 arr2가 되기 위해 무엇을 추가하고, 무엇을 빼야 하는지 알 수 있습니다. "Collect..

개념 & 응용 2024.04.20 0

[Swift] 프로토콜 메서드의 매개변수 기본 값 설정 (Defining default parameters for protocol methods)

서론 프로토콜 타입을 사용할 때 불편한 점이 하나 있습니다. 메서드 파라미터에 기본 값을 사용할 수 없다는 점입니다. 예를 들어, UseCase의 execute 파라미터로 page를 전달해야 한다고 합시다. protocol UseCaseProtocol { func execute(page: Int) } struct UseCase: UseCaseProtocol { func execute(page: Int) { // Logic } } let useCase: UseCaseProtocol = UseCase() useCase.execute(page: 1) 그러면 위 코드처럼 항상 page를 전달해줘야 해요. page에 기본 값을 설정하고 싶어도 프로토콜 메서드에는 Default argument를 설정할 수 없다는 ..

개념 & 응용 2024.02.24 0

[Swift] NSCoding과 Codable 차이점 (상속 관계 유지하기)

NSCoding과 Codable Codable이 나오면서 NSCoding은 옛날의 그것으로 생각되었습니다. 그런데 NSCoding만이 할 수 있는 일이 있었습니다. 바로 상속 관계를 유지해서 저장하는 것입니다. Shape 부모 클래스를 상속하는 두 개의 자식 클래스가 있습니다. class Plane { var shapes: [Shape] init(shapes: [Shape]) { self.shapes = shapes } func display() { for shape in shapes { print("\(type(of: shape)): \(shape.description)") } } } let shapes: [Shape] = [ Rect(point: .init(x: 10, y: 10), size: .in..

개념 & 응용 2023.09.24 3

iOS

more

[Xcode] Placeholder가 있는 Code Snippet 작성 방법

Code Snippet Code Snippet은 미리 정한 짧은 키워드로 긴 코드를 자동 완성해주는 기능입니다. 아무리 긴 코드라도 미리 등록한 단축어를 입력하면 끝이니 생산성에 큰 도움을 줍니다. (전 Attributes, Constraints처럼 오타가 많이 나는 단어도 애용합니다 ㅎㅎ;) Code Snippet은 많이들 아시지만, placeholder가 포함된 code snippet은 잘 모르기도 합니다. Placeholder가 있다면 무엇을 넣어야 할지 파악하기 쉽고, Tab을 이용하여 입력 부분으로 바로 이동할 수도 있습니다. (중요) Placeholder를 포함한 Code Snippet 생성 Placeholder는 를 작성하면 됩니다. Code Snippet이 아니더라도 코드 입력창에서 을 작..

Xcode 2024.04.03 0

[iOS] DTO의 Optional 속성과 앱의 하위 호환성 고민 (결론 없음 주의)

* 혼자 고민한 과정을 기록 목적으로 적은 포스팅입니다. 읽기 전 참고 부탁드립니다 :) DTO DTO는 서버와 통신하는 API의 데이터를 디코딩, 인코딩하기 위한 객체입니다. { "id": 1000, "name": "다이어트", "continued": 10, "lastChallenged": "2011-04-10T20:09:31Z" } 가령 API로 오는 데이터가 위와 같다면, struct CategoryDTO: Codable { let id: Int let name: String let continued: Int let lastChallenged: Date } CategoryDTO는 id, name, continued, lastChallenged 속성을 가지게 됩니다. 이때 각 속성은 Non-옵셔널이 ..

개념 & 개발 2024.03.20 0

[iOS] ProxyMan 설치부터 Response 관찰까지

서론 앱을 개발할 때 서버와 API 통신을 자주 합니다. API 통신 개발 과정에서 문제가 생겼을 때 디버깅을 위해 Postman, Swagger를 사용하기도 합니다. Postman, Swagger도 좋은 방법이지만, 실제 내 앱이 어떤 요청과 응답을 주고 받는지 궁금할 때가 있습니다. if let requestBody = urlRequest.httpBody, let requestBodyString = String(data: requestBody, encoding: .utf8) { print("[요청 데이터]\n\(requestBodyString)") } if let responseBody = try? encoder.encode(body), let responseBodyString = String(dat..

개념 & 개발 2024.02.21 1

iOS 프로젝트

more

[iOS] moti 개발일지 - 5. 보이스 오버(Voice Over)

GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti는 더 나은 사용자 경험을 위해 노력한 앱입니다. 지금까지 작성한 인터랙션 애니메이션, 메모리 개선 등이 그 예시인데요. 이번 포스팅에서 다루는 보이스 오버도 더 나은 사용자 경험을 위해 적용한 기능입니다. 또한, 큰 기업 위주이지만 올해부터 모바일에도 접근성 지원을 필수로 적용해야 합니다. 접근성이 드디어 모바일에도 적용이 되는구나 느껴졌던 현상이에요. 이러한..

[iOS] moti 개발일지 - 4. 다운 샘플링과 메모리 캐시 개선

GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 moti 앱은 사진이 핵심 콘텐츠인 앱입니다. 모든 곳에서 사진을 보여줘요. 그렇기 때문에 이미지에 사용하는 메모리가 많습니다. 이번 개발일지에서는 이미지에 소비되는 메모리를 줄이기 위해 도입한 다운 샘플링과 메모리 최적화 과정을 다뤄보겠습니다. 특별하진 않지만 매우 중요한 고민 과정이었습니다. 다운 샘플링이 필요한 이유 다운 샘플링을 적용하기 전, 팀원에게 다운 샘플..

[iOS] moti 개발일지 - 3. Interaction Animation

GitHub - boostcampwm2023/iOS02-moti: 네이버 부스트캠프 8기 iOS moti 앱 📸 네이버 부스트캠프 8기 iOS moti 앱 📸. Contribute to boostcampwm2023/iOS02-moti development by creating an account on GitHub. github.com 서론 이번 포스팅에서는 인터랙션 애니메이션을 다룹니다. moti에서는 인터랙션 애니메이션도 하나의 도전 과제로 설정했습니다. 사용자 경험을 좋게 하기 위한 요소 중 하나라고 생각했기 때문입니다. 그래서 moti에는 어떤 인터랙션 애니메이션이 있는지, 구현을 하면서 어떤 어려움이 있었는지 말해보겠습니다. 인터랙션 애니메이션 적용 이유 처음 인터랙션 애니메이션에 대해 알게된건 ..

회고

more

[회고] 네이버 부스트캠프 웹・모바일 8기 마지막 회고

서론 길고 긴 네이버 부스트캠프가 끝이 났습니다. 네이버 부스트캠프의 공식적인 마지막 일정은 12/15였고, 수료식은 12/16였습니다. (벌써 한 달이 지났네요;;) 늦게나마 멤버십 수료 회고를 작성해보려고 합니다. 네이버 부스트캠프를 수료한 저는 어떤 점이 달라졌는지를 중점으로 작성해 볼게요. (네이버 부스트캠프 회고도 이 글이 마지막이겠네요. 물론 프로젝트는 꾸준히 유지보수할 예정이기 때문에 moti의 개발일지는 올라올 거 같아요 🙂) 숲을 보는 문제해결력 먼저 문제 해결에 임하는 태도가 바뀌었습니다. 네이버 부스트캠프 이전에는 문제 해결을 주먹구구식으로 진행했던 거 같아요. 당장의 문제 해결에 급급해서 사이드 이펙트, 전반적인 구조, 근본적인 원인 등을 고민하지 않았고, 단순히 문제 해결이 되면 ..

[회고] 네이버 부스트캠프 웹・모바일 8기 그룹 프로젝트 3, 4주 차 회고 & 기술적 고민

서론 최근 개발에 치여 포스팅을 많이 못했네요.. 어떻게 하면 더 잘 활용할 수 있을지 고민하는 주였던 거 같습니다. 3, 4주 차 회고를 묶어서 어떤 고민을 했는지 작성해 보겠습니다. 점점 커지는 프로젝트 4주 정도 개발하니 프로젝트가 점점 커지고 있습니다. (물론 현업 개발자분들이 보시면 코웃음 칠 사이즈지만요 ㅎ;) 프로젝트가 커지면서 다른 팀원이 작성한 흐름이 잘 안 보이기도 하고, 제가 작성한 흐름을 까먹기도 하고 있습니다. 어떻게 하면 이런 부작용을 줄일 수 있을까 고민하다 네이밍에 더 신경 쓰기로 했습니다. 아키텍처나 디자인패턴이 답일 수 있겠지만.. 마감까지 2주밖에 안 남은 상태에서는 불가능한 선택지였습니다. 그래서 최소한 네이밍이라도 명확하게 쓰자!라고 다짐했습니다. 동시에 extens..

[회고] 네이버 부스트캠프 웹・모바일 8기 그룹 프로젝트 2주 차 회고 & 기술적 고민

서론 그룹 프로젝트 1주 차에는 기획을 주로 했고, 이를 바탕으로 그룹 프로젝트 2주 차에는 실제 개발에 들어갔습니다. 처음으로 협업을 해보면서 무엇을 느꼈는지 작성하고, 어떤 기술적 고민을 했는지도 적어보겠습니다. 그리고 최근에 도파민 다이어트를 해보고 있는데요. 이에 대한 짧은 이야기도 해보려고 합니다 ㅋㅋ 협업을 나누는 단위 저희 모티메이트 팀의 iOS는 저와 팀원 1명, 총 두 명입니다. 함께 기획하고 디자인한 걸 어떻게 나눠야 좋게 협업할 수 있을지 고민했습니다. 근데 이게 회사의 협업이랑은 성격이 좀 다른거 같더라고요. 회사의 협업은 효율 중심이지만 네이버 부스트캠프는 함께 성장하는 측면을 더 강조하고 있었습니다. 그래서 어떻게 해야 함께 성장하고 앱의 흐름을 모두가 이해하면서 적당히 효율도 ..

반응형