전체 글49 [iOS] 파이브 라인즈 오브 코드: 1~3장 요약 및 정리 (리팩터링: 왜 필요하고 어떻게 할까?) 리팩터링: 왜 필요하고 어떻게 할까? 안녕하세요, 여러분!최근에 제가 개발하면서 느꼈던 불편함과 이를 해결하기 위해 리팩터링을 어떻게 적용했는지 공유해보려고 합니다. 요즘 iOS 개발을 하면서 코드가 점점 복잡해지는 걸 느꼈어요. 특히 유지보수가 어려워지고, 새로운 기능을 추가할 때마다 버그가 생기는 문제를 겪었죠.그래서 이번 기회에 리팩터링에 대해 진지하게 고민해보게 되었습니다. 이 책을 통해 여러분은 다음과 같은 내용을 배울 수 있습니다: • 코드 가독성 향상: 가독성이 높은 코드를 작성하는 방법 • 효율적인 함수와 변수 사용법: 함수와 변수를 효율적으로 사용하는 방법 • 조건문과 반복문의 최적화: 조건문과 반복문을 최적화하여 성능을 높이는 방법 • 코드 분할과 리팩터링: 코드를 작은 단위로 분할하.. 2024. 7. 23. [Swift] Task, async let, Task Group 동시 작업의 모든것 비동기 작업을 수행할 때, 여러 개의 작업을 동시에 진행해야 하는 경우가 있습니다. 이를테면, 두 개의 이미지를 다운 받고, 그 두개의 이미지를 return하는 작업이 있을 수 있습니다. 다음은 코드 예시입니다. func fetchTwoURLs() async throws -> (Data, Data) { let url1 = URL(string:"https://www.apeth.com/pep/manny.jpg")! let url2 = URL(string:"https://www.apeth.com/pep/moe.jpg")! let data1 = try await self.download(url: url1) let data2 = try await self.download(url: url2) return (data.. 2024. 3. 7. [Swift] Actor, @MainActor, Task, Sendable의 모든것 Actor기본적으로 액터의 코드는 백그라운드 스레드에서 실행됩니다. Swift의 구조적 동시성에서 스레드는 낮은 수준에서 존재하며, 코드는 어떤 스레드에나 할당될 수 있습니다. 메인 스레드와 백그라운드 스레드의 구별은 중요하며, 이를 위해 '액터'라는 개념이 사용됩니다. 액터를 사용하면 코드가 어떤 스레드에서 실행되어야 하는지를 명시할 수 있으며, 이를 통해 복잡한 동시성 문제를 효과적으로 처리하고 코드를 깔끔하게 유지할 수 있습니다. Swift에서 Actor는 백그라운드 스레드에서 코드를 실행하는 데 도움이 되며, 멀티스레딩 코드를 안전하게 실행하는 데 중요한 역할을 합니다. 멀티스레딩 코드에서 가장 큰 문제점은 공유 상태의 문제입니다. 속성이 하나 이상의 스레드에서 변경될 수 있다면, 코드는 일관성 .. 2024. 3. 5. [Swift] 비동기 메소드를 async/await 메소드로 변환하는 방법 (`withUnsafeContinuation`) Swift의 비동기 메소드를 async/await 메소드로 변환하기Swift 5.5는 비동기 프로그래밍을 간소화하는 새로운 기능을 도입했는데, 그 중 하나가 async/await 패턴입니다.이 패턴을 사용하면 비동기 코드를 알기 쉽고 깔끔하게 작성할 수 있습니다. 하지만 이미 작성된 비동기 메소드를 새로운 async/await 메소드로 변환해야 할 때가 있습니다.예를 들어, 아래와 같은 비동기 메서드가 있다고 가정합니다.이 코드를 수정할 수 없다면,어떻게 async/await 메서드에서 이 메서드를 호출할 수 있을까요?func download(url: URL, completionHandler: @escaping (Result) -> Void) { let task = URLSession.shared... 2024. 3. 2. [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. 이전 1 2 3 4 5 ··· 7 다음