본문 바로가기

Swift25

[Swift] `@dynamicMemberLookup과 KeyPath 그리고 WritableKeyPath<Root, Value>` KeyPath는 Swift의 기능 중 하나로, 타입 안전한 속성 또는 서브스크립트에 대한 참조를 나타냅니다. 이를 사용하면 속성이나 서브스크립트의 값을 타입 안전하게 저장하고 조작할 수 있습니다. 예를 들어, Person이라는 구조체를 정의하고 name이라는 속성을 가지고 있다고 가정해봅시다. 이때 Person 구조체의 인스턴스에서 name 속성에 접근하고자 한다면, KeyPath를 사용하여 타입 안전하게 이러한 속성에 접근할 수 있습니다.struct Person { let name: String } let person = Person(name: "jimmy") let nameKeyPath = \Person.name person[keyPath: nameKeyPath] // "jimmy" person[ke.. 2023. 11. 12.
[Swift] 뷰 재사용하기 - Delegate 패턴 활용 얼마전 개발한 운동 기록앱인 JimFit에서 손잡이를 통해 높이 조절이 가능한 바텀뷰를 구현했습니다. 바텀뷰에는 UISwipeGestureRecognizer, TitleLable, RighBarButton이 있습니다.여러 뷰컨트롤러에서 이를 재사용하고 있기 때문에 코드를 수정할 때 뷰컨트롤러과 바텀뷰 간에 의존성이 발생해 코드 수정에 어려움을 겪었습니다. 이 문제는 Protocol과 Delegate 패턴을 활용하여 의존성을 분리하고, 직관적인 코드를 구현할 수 있었습니다. 1. GrabberViewDelegate Protocol 정의하기먼저, GrabberViewDelegate Protocol을 정의합니다. 이 Protocol은 GrabberView에서 발생하는 이벤트를 처리하기 위해 구현해야 할 메서드.. 2023. 11. 12.
[Swift] ETag를 활용한 캐시 유효성 검증 ( 서버 비용 줄이기) JimFit 앱을 개발하면서 운동 DB를 관리하는 데 많은 고민을 했습니다.로컬 디바이스에서 관리하기 위해 Realm 형태의 DB를 생성하기로 선택했습니다.이로 인해 AppBundle에서는 읽기가 가능하지만 쓰기에 제약이 있어 Realm 파일에 접근하는 데 문제가 발생했습니다. 이 문제는 다음과 같은 방법으로 해결할 수 있었습니다. [Swift] Realm 파일을 프로젝트 내부에 삽입하는 방법 및 사용하기 (파일 접근 에러)요약실제 기기에서는 번들에 있는 Realm 파일에 접근할 수 없어서 파일 접근 에러가 발생합니다. 이를 해결하기 위해 앱이 실행 중일 때 Realm 파일을 앱의 documentDirectory로 복사하여 사용하는 방법을 사용할 수 있습니다. 이렇게 하면 파일에 대한 읽기 및 쓰기 권한.. 2023. 11. 12.
[Swift] 프로젝트에 SRP와 CleanCode적용해보기 CleanCode는 소프트웨어 개발에서 가독성과 유지보수성을 높이기 위해 적용되는 개발 방법론입니다. CleanCode의 함수 파트를 읽으면서 제가 작성한 코드를 반성하게 되었는데요. 클린코드에서 함수를 깨끗하게 작성하기 위한 여러 방법들 중 가장 인상 깊었던 규칙 몇가지를 제 프로젝트에 적용해봤습니다. 가장 인상 깊었던 규칙 은 다음과 같습니다.1. 함수는 작게 만들어라2. 함수 내 모든 문장의 추상화 수준은 동일해야 한다3. 서술적인 이름을 사용해라4. 함수는 한 가지만 해야한다(SRP) 먼저 저를 반성하게 만든 문제의 코드를 보겠습니다.Beforefinal class WorkoutLogTableViewCell: UITableViewCell { var workout: Workout? { didSet .. 2023. 11. 12.
[Swift] Observable(UniCast) vs Subject(MultiCast) { Bind vs Drive } RxSwift를 공부하다 보면 Observable과 Subject가 나오는데 둘의 차이점이 무엇일까요?같은 Observable을 여러 Observer에서 구독했는데 어떤 경우에는 같은 값이 오고 어떤 경우에는 다른 값이 오는 이유는 무엇일까요?Subscribe와 Bind와 Drive의 차이는 무엇일까요? 오늘은 이 궁금증에 대해서 알아보도록 하겠습니다.Observable(UniCast)Observable은 RxSwift에서 사용되는 개념으로, 단일 값을 방출하는 일련의 이벤트 스트림입니다. Observable은 이벤트를 생성하고, 이벤트를 구독하는 Observer들에게 이벤트를 전달합니다. Observable은 하나의 Observer에게만 이벤트를 전달하는 UniCast 방식입니다. 예를들어 아래와 같은.. 2023. 11. 7.
[Swift] NavigationBar의 Title높이가 이상할때 원인 요약네비게이션 타이틀의 위치 문제가 발생했습니다.이 문제의 원인은 네비게이션 컨트롤러가 중첩되어 있었기 때문입니다.SceneDelegate에서 TabBarController를 NavigationController 안에 중첩했으며,TabBarController에서 FirstVC를 생성할 때도 NavigationController에 중첩되었습니다.이 문제를 해결하기 위해 나는 SceneDelegate에서 NavigationController를 제거하여 문제를 해결했습니다. 문제아래 (좌측) 뷰 컨트롤러의 Title이 살짝 아래로 내려가 있는 것을 확인할 수 있습니다.원래는 (우측) 뷰 컨트롤러처럼 Title이 상단에 가까워야 합니다.문제의 뷰컨트롤러 정상적인 뷰컨트롤러뷰 계층이상해서 뷰의 계층을 살펴봤습니다.. 2023. 10. 2.