본문 바로가기

전체 글43

[Xcode Cloud] The bundle version must be higher than the previously uploaded version. 문제Xcode cloud로 테스트플라이트를 자동 배포하기 위해서 아카이빙을 진행하는 도중 아카이빙에서 문제가 발생했습니다. 원인은 번들 버전이 현재 업로드 되어있는 버전보다 낮기 때문이라고 하는데요 현재 업로드 되어있는 테스트플라이트 버전을 보면 다음과 같았습니다Bundle Version: 1.0.0Build Version: 61 그래서 Build Version을 63으로 올리고 git push를 진행해봤습니다 또 Fail…Running ci_post_clone.sh script failed (exited with code 1)이건 또 어떤 에러일까요… ci_post_clone.sh가 무엇인가 하면빌드되기 전에 Xcode Cloud 컴퓨터에서 Cocoa Pod을 설치해주기 위해미리 작성한 스크립트 파일입.. 2023. 12. 10.
[Swift] Objective-C ↔ Swift 브릿징 Objective-C 에서 Swift 사용하는 방법#import "프로젝트 명-Swift.h"를 사용하면 swift 객체를 Objective-C 문법 그대로 활용 가능#import "ViewController.h" #import "프로젝트 명-Sift.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; popCalendarViewController = [[PopCalendarViewController alloc] init]; } - (IBAction)buttonClicked:(id)sender { popCalendarViewController.modalPres.. 2023. 12. 3.
[Swift] 메서드 체이닝을 활용하여 UIKit을 SwiftUI처럼 사용하기 View 객체를 생성할 때 어떻게든 코드를 편하게 작성해보려고 노력해봤지만기본 UIKit으로는 다음과 같이 가독성을 높이는데 한계점이 있었습니다. lazy var button1: UIButton = { let button = UIButton() var config = UIButton.Configuration.plain() config.title = "Plain Button" config.subtitle = "SubTitle" config.buttonSize = .medium config.image = UIImage(systemName: "swift") button.configuration = config button.addTarget(self, action: #selector(button1Tapped),.. 2023. 11. 13.
[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.